#sql-server
#sql-server
Вопрос:
Я вставляю пути к файлам из локальной папки в свою таблицу базы данных, используя MASTER.DBO.XP_CMDSHELL
. все пути вставляются в таблицу, включая null
at last. Я хочу предотвратить вставку этого null
в таблицу Filepath.
Я установил столбец как not null
, но он не работает, поскольку он прервал все операции вставки.
Вот мой код:
declare @date varchar(20)= '2019/04/17'
declare @query varchar(max)
DECLARE @DD VARCHAR(50)
DECLARE @MM VARCHAR(50)
DECLARE @YYYY VARCHAR(50)
DECLARE @PATTERN VARCHAR(50)
SET @PATTERN='*.CSV'
SET @DD=SUBSTRING(@DATE,9,2)
SET @MM=SUBSTRING(@DATE,6,2)
SET @YYYY=SUBSTRING(@DATE,1,4)
create table #z(id int identity(1,1),filepath varchar(max))
SET @QUERY ='MASTER.DBO.XP_CMDSHELL ''DIR D:FILEfolder' @YYYY '' @MM '' @DD '' @PATTERN ' /B/S'''
INSERT #z EXEC (@QUERY)
Комментарии:
1. Сделайте поле ненулевым. Почему вы используете
xp_cmdshell
though? Если вы хотите выполнить сценарий оболочки, просто сделайте это из оболочки. Откройте командную строку и запустите скрипт. Или создайте задание оболочки в агенте SQL Server.2. Если вы не хотите
NULL
, чтобы их вставляли, и вы не хотитеINSERT
, чтобы еслиNULL
был предоставлен сбой, что вы хотите, чтобы произошло? ЕслиNULL
задается как значение, тоDEFAULT
значение также не будет использоваться; вам нужно либо исключить столбец изINSERT
инструкции, либо использоватьVALUES
предложение и использоватьDEFAULT
оператор.3.
but it doesn't work as it aborted all the insert operations.
это то, что вы задали в этом вопросе. Это сработало. Кстати, почему любой скрипт, который перечисляет папки, возвращает значение null? Вы должны опубликовать свой код, чтобы люди могли помочь4. Я бы просто вставил a
DELETE #z WHERE filepath IS NULL
, чтобы избавиться от него (или aWHERE filepath IS NOT NULL
в последующем запросе). Это предполагает, что я быxp_cmdshell
вообще использовал, чего я бы не стал делать; такая логика лучше всего обрабатывается вне T-SQL.5. Если вы настаиваете на сохранении
xp_cmdshell
, то нет. Это потомуdir
, что всегда будет заканчиваться пустой строкой иxp_cmdshell
всегда будет переводить ее вNULL
. «Исправление», которое, вероятно, можно было бы выполнить с помощью тайной магии в.cmd
файле, но если вы готовы зайти так далеко, вы также должны быть готовыxp_cmdshell
полностью отказаться.