我有这个存储过程接受一个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'”。 我不明白为什么它只获得输入的第一个字符
答案 0 :(得分:7)
查看参数声明:
@whichColumn varchar
在数据定义或变量声明中未指定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并产生错误。