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

标签 sql-server tsql stored-procedures dynamic-sql

我有这个存储过程,它接受一个 comlumn 名称作为输入参数。 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'”。
我不明白为什么它只获取输入的第一个字符

最佳答案

查看您的参数声明:

@whichColumn varchar

From MSDN :

When n is not specified in a data definition or variable declaration statement, the default length is 1.



所以这是一个单字母 varchar .尝试指定一个大小:
@whichColumn varchar(50)

或者更好的是,使用系统定义的类型作为对象名称:
@whichColumn sysname

关于sql-server - 存储过程中的动态sql,以列名作为输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332143/

相关文章:

sql - 请问有人能解释为什么在SQL Server 2005中删除和重新创建存储过程会导致最初的速度下降比预期的要多得多吗?

sql-server - 如何根据sql中的选定数据集重复行

sql - 多个表中的多个更新和删除 SQL Server

sql - 从函数调用动态SQL

sql - T-SQL 相当于 =rand()

sql-server - SQL Server 2000 - 如何在查询的最终结果中轮换联接结果?

python - 如何从 Docker 容器中的 python 脚本连接到 Ubuntu 上的本地 SQL 服务器

sql - GROUP 中不同表的 COUNT 个

javascript - 客户端Javascript调用Postgresql存储过程

mysql - 使用mysql中的存储过程创建用户注册