将变量传递给存储过程SELECT命令

时间:2014-06-11 13:13:21

标签: sql sql-server stored-procedures

我有一个带有存储过程链接的网页,我想将一个变量传递给存储过程select语句。到目前为止的代码是 -

ALTER procedure [dbo].[RTO]

@Weeknumber int,
@asset nvarchar(50)
AS

Begin 

SELECT @asset
FROM RTO_weeklyanalysis
Where weekNumber = @weeknumber

END

基本上@asset将是列的名称,但这将根据用户在页面上选择的内容而改变。

2 个答案:

答案 0 :(得分:1)

您需要使用Dynamic sql。在将对象名称连接到sql查询时,也使用QuoteName()函数。并使用系统存储过程sp_executesql执行动态查询,以最安全,最安全的方式执行动态sql。如下:

ALTER procedure [dbo].[RTO]
@Weeknumber int,
@asset sysname
AS
Begin 
 SET NOCOUNT ON;
  DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N' SELECT  '+  QUOTENAME(@asset) + '
              FROM RTO_weeklyanalysis
              Where weekNumber = @weeknumber'

EXECUTE sp_executesql @Sql
                     ,N'@Weeknumber int'
                     ,@Weeknumber
END

答案 1 :(得分:0)

您不能以这种方式动态使用列名。实现你想要的最简单的方法是从临时变量执行整个查询,我的意思是:

declare @query
set @query = 'SELECT ' + @asset  ' FROM RTO_weeklyanalysis Where weekNumber = @weeknumber'
exec sp_executesql @query