SQL Server插入语句中的可选列基于输入值

时间:2016-07-31 19:57:44

标签: sql-server tsql

我有一个存储过程,它带有SQL Server 2012中表的insert语句。

它列出了所有列和值:

insert into TABLE_NAME (name, rating, link) 
values (@name, @rating, @link).

我遇到的问题是某些列被指定为null但是值作为空字符串传递给存储过程(或者对于允许空值的int列类型为零)并且我不想插入空字符串或者允许空值的列中的零。

是否有办法修改insert语句以排除那些不应插入值的列,仅基于传入的参数值?

3 个答案:

答案 0 :(得分:1)

您无法动态地从插入语句中排除这些值,但是如果它们是空字符串或者您不喜欢的话,则可以使用the NULLIF function将输入值转换为NULL #39; t想要。

答案 1 :(得分:1)

INSERT INTO TABLE_NAME (name, rating, link) 
SELECT NULLIF(@name, ''), NULLIF(@rating, 0), NULLIF(@link, '')

答案 2 :(得分:0)

我不认为SQL Server允许使用" DEFAULT"表达式,您可以说:

insert into TABLE_NAME (name, rating, link)
    values (coalesce(@name, default), coalesce(@rating, default), coalesce(@link, default))

因此,它留下了动态SQL。像这样:

declare @sql nvarchar(max);

set @sql = 'insert into TABLE_NAME(name, rating, link)
                 values (' + (case when @name is null then 'default' else '@name' end) + ', ' +
                         (case when @rating is null then 'default' else '@rating' end) + ', ' +
                         (case when @link is null then 'default' else '@link' end))';

exec sp_executesql @sql, N'@name ??, @rating ??, @link ??',
      @name = @name, @rating = @rating, @link = @link;