存储过程中的动态sql,列名作为输入参数

kab*_*oom 3 t-sql sql-server stored-procedures dynamic-sql

我有这个存储过程接受comlumn名称作为inptu参数.SELECT语句将根据输入参数选择一列

create procedure getColumn (@whichColumn varchar)
as
begin
    declare @sql nvarchar(max) 
    set @sql = 'SELECT [' + @whichColumn + ']' 
        + ' FROM myTable'
        + ' where ['+ @whichColumn + '] is not null'
        + ' and [' + @whichColumn + '] != '''' ' ;
    exec sp_executesql @sql
end
Run Code Online (Sandbox Code Playgroud)

当我执行这个存储过程时,

exec getColumn 'Apple';
Run Code Online (Sandbox Code Playgroud)

错误显示"无效的列名称'A'".我不明白为什么它只获得输入的第一个字符

And*_*mar 7

看看你的参数声明:

@whichColumn varchar
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

如果未在数据定义或变量声明语句中指定n,则默认长度为1.

这是一封单字母varchar.尝试指定大小:

@whichColumn varchar(50)
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,使用系统定义的类型对象名称:

@whichColumn sysname
Run Code Online (Sandbox Code Playgroud)

  • @ M.Ali:如果省略`cast`和`convert`的长度,那就是这样.但在变量声明中,默认长度为1.你可以[在这里投票](https://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=244395)来解决这个问题. (3认同)