我们有一个使用动态sql构建的存储过程,其中我们的应用程序传递了一些列名。有时会为列名传递空值或空值。在这些情况下,sp需要为列返回null值。我已经尝试了各种方法来处理这个问题,但无论我做什么,我似乎都会得到以下错误:
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.
以下是尝试在@ Col2参数中处理空列名称时的示例查询:
DECLARE
@Col1 varchar(32) = 'name',
@Col2 varchar(32) = '',
@sqlCommand nvarchar(MAX) = ''
SET @sqlCommand = @sqlCommand + N'
SELECT ' + quotename(@Col1) + ' AS ' + quotename(@Col1) + ',
CASE WHEN ' + quotename(@Col2) + ' IS NULL OR ' + quotename(@Col2) + ' = ''''
THEN NULL
ELSE ' + quotename(@Col2) + '
END AS Col2
FROM sys.columns c '
EXECUTE sp_executesql @sqlCommand
答案 0 :(得分:0)
<强>解决方案强>
DECLARE
@Col1 varchar(32) = 'name',
@Col2 varchar(32) = '',
@sqlCommand nvarchar(MAX) = ''
SET @sqlCommand = @sqlCommand + N'
SELECT ' + quotename(@Col1) + ' AS ' + quotename(@Col1) + ',' +
CASE WHEN @Col2 IS NULL OR @Col2 = ''
THEN 'NULL '
ELSE quotename(@Col2)
END + ' AS Col2
FROM sys.columns c '
--print @sqlCommand
EXECUTE sp_executesql @sqlCommand
备注强>
当您遇到动态SQL问题时,请尝试使用Print
语句将生成的命令输出到SSMS(或者如果您没有使用SSMS,请找一些其他方法来撤回生成的SQL,以便您可以看到发生了什么。
使用原始代码执行此操作会显示生成的语句为:
SELECT [name] AS [name],
CASE WHEN [] IS NULL OR [] = ''
THEN NULL
ELSE []
END AS Col2
FROM sys.columns c
...你可能会看到问题。
问题在于,您在用于生成动态SQL的SQL与要返回的动态SQL语句的一部分所需的SQL之间感到困惑。