列名称为变量的SQL存储过程

时间:2020-05-20 17:06:05

标签: sql-server tsql stored-procedures

我真的认为这是一个简单的解决方法,但是我在Internet上找不到任何解决方案(至少我无法理解)。

我有这个存储过程:

ALTER PROC [dbo].[GetCard](
    @Input varchar(50),
    @Input2 varchar(50)
)
AS
SELECT * FROM Main WHERE @Input = @Input2;

但是我去的时候

GetCard 'CardName', 'Text';

SQL不太了解@Input是一列。我必须改变什么?是否需要任何特殊的语法?

3 个答案:

答案 0 :(得分:2)

像这样构建查询字符串(认为单引号正确),然后执行它:

SET @qString = 'SELECT * FROM MAIN WHERE ' + QuoteName(@Input) + ' = ''' + @Input2 + ''''

exec(@qString)

Simple fiddle demo

正如罗曼指出的那样,在使用动态SQL时要格外小心。阅读有关SQL注入的内容。

答案 1 :(得分:2)

最好按照 Andrew 或Roman Czerwinski的建议使用动态SQL。 但是,如果您不想使用动态SQL,则可以使用以下逻辑:

ALTER PROC [dbo].[GetCard](
    @Input varchar(50),
    @Input2 varchar(50)
)
AS
SELECT * 
FROM Main 
WHERE CardName  = case when @Input = 'CardName'    then @Input2 else CardName    end
and OtherColumn = case when @Input = 'OtherColumn' then @Input2 else OtherColumn end
--etc...

答案 2 :(得分:0)

在代码示例中,没有名称为@ Input1的列,参数或变量。

相关问题