Как предотвратить вставку нулевых значений в таблицу базы данных?

#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 , чтобы избавиться от него (или a WHERE filepath IS NOT NULL в последующем запросе). Это предполагает, что я бы xp_cmdshell вообще использовал, чего я бы не стал делать; такая логика лучше всего обрабатывается вне T-SQL.

5. Если вы настаиваете на сохранении xp_cmdshell , то нет. Это потому dir , что всегда будет заканчиваться пустой строкой и xp_cmdshell всегда будет переводить ее в NULL . «Исправление», которое, вероятно, можно было бы выполнить с помощью тайной магии в .cmd файле, но если вы готовы зайти так далеко, вы также должны быть готовы xp_cmdshell полностью отказаться.