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

时间:2014-03-11 17:28:07

标签: sql-server tsql 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

执行此存储过程时,

exec getColumn 'Apple';

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

3 个答案:

答案 0 :(得分:7)

查看参数声明:

@whichColumn varchar

From MSDN

  

在数据定义或变量声明中未指定n时   声明,默认长度为1。

这是一个单字母varchar。尝试指定大小:

@whichColumn varchar(50)

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

@whichColumn sysname

答案 1 :(得分:3)

create procedure getColumn (@whichColumn nvarchar(128))   --<-- Maximum column name lenght
as
begin
    declare @sql nvarchar(max); 
    set @sql =   N'SELECT ' + QUOTENAME(@whichColumn)+ N' FROM myTable'
               + N' where '+ QUOTENAME(@whichColumn) + N' is not null'
               + N' and ' + QUOTENAME(@whichColumn)  +  N' != '''' ' ;
    exec sp_executesql @sql
end

在旁注中使用连接字符串中的方括号与使用QUOTENAME函数不同。

答案 2 :(得分:1)

更改此行

create procedure getClumn (@whichColumn varchar)

create procedure getClumn (@whichColumn varchar(max))

因为如果你当时没有指定varchar的大小,它只考虑一个字符,所以它只得到一个字符A并产生错误。