我有一个存储过程,它带有SQL Server 2012中表的insert语句。
它列出了所有列和值:
insert into TABLE_NAME (name, rating, link)
values (@name, @rating, @link).
我遇到的问题是某些列被指定为null但是值作为空字符串传递给存储过程(或者对于允许空值的int列类型为零)并且我不想插入空字符串或者允许空值的列中的零。
是否有办法修改insert语句以排除那些不应插入值的列,仅基于传入的参数值?
答案 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;