处理动态sql

时间:2016-12-20 16:42:46

标签: sql-server

我们有一个使用动态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

1 个答案:

答案 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之间感到困惑。