调用sp_executesql执行动态SQL未赋值@Set变量的报错问题
SQL运行报错/返回NULL问题成因分析
问题SQL代码如下:
declare @Field as varchar(10); declare @Set as varchar(10); set @Field = 'id_fonte' declare @sql nvarchar(max) set @sql = 'select ' + @Set + ' = id_fonte from fontes where [' + replace(@Field, '''', '''''') + '] = 54'; exec sp_executesql @sql
具体成因
- SQL Server中仅完成声明、未显式赋值的变量默认值为NULL,上述代码里的
@Set变量没有执行任何SET赋值操作,初始值为NULL。 - T-SQL的字符串拼接规则为:只要拼接项中存在NULL值,整个拼接结果就会返回NULL。代码拼接
@sql变量时用到了值为NULL的@Set,导致最终生成的@sql整体值为NULL。 - 系统存储过程
sp_executesql接收的SQL参数为NULL时,会直接触发执行报错,或者无有效返回结果,最终表现为返回NULL或执行报错。
内容的提问来源于stack exchange,提问作者Pawel Maschtakow
相关产品推荐
相关产品推荐

