我可以在SQL存储过程中将列名作为输入参数传递

use*_*809 36 sql stored-procedures

create procedure sp_First
@columnname varchar
AS
begin
select @columnname from Table_1
end 
exec sp_First 'sname'
Run Code Online (Sandbox Code Playgroud)

我的要求是将列名称作为输入参数传递.我试过这样,但它给出了错误的输出.

所以帮助我

Mat*_*lie 60

您可以通过几种方式完成此操作.

一,是自己构建查询并执行它.

SET @sql = 'SELECT ' + @columnName + ' FROM yourTable'
sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

如果您选择使用该方法,请务必确定您的输入.即使您知道您的应用程序只会提供"真正的"列名称,如果某人发现您的安全性破解并且能够直接执行SP,该怎么办?然后他们可以执行他们喜欢的任何事情.使用动态SQL,始终始终验证参数.

或者,你可以写一个CASE声明......

SELECT
  CASE @columnName
    WHEN 'Col1' THEN Col1
    WHEN 'Col2' THEN Col2
                ELSE NULL
  END as selectedColumn
FROM
  yourTable
Run Code Online (Sandbox Code Playgroud)

这有点长啰嗦,但更加安全.

  • +1,`这是一个更长的啰嗦,但更安全 (13认同)

Dar*_*opp 12

不,那只会选择参数值.您需要使用动态SQL.

在您的程序中,您将拥有以下内容:

DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1';
exec sp_executesql @sql, N''
Run Code Online (Sandbox Code Playgroud)

  • 它一定要慢一点吧?但多少钱?可以忽略吗? (3认同)
  • 不,不会慢很多。唯一慢的是字符串串联开销。sp_executesql将以与其他任何命令一样将其转换为执行计划的方式执行文本。 (2认同)

Joh*_*wey 9

尝试使用动态SQL:

create procedure sp_First @columnname varchar 
AS 
begin 
    declare @sql nvarchar(4000);
    set @sql='select ['+@columnname+'] from Table_1';
    exec sp_executesql @sql
end 
go

exec sp_First 'sname'
go
Run Code Online (Sandbox Code Playgroud)


usr*_*usr 7

这是不可能的.使用动态SQL(危险)或巨大的案例表达(慢).