我有一个带有存储过程链接的网页,我想将一个变量传递给存储过程select语句。到目前为止的代码是 -
ALTER procedure [dbo].[RTO]
@Weeknumber int,
@asset nvarchar(50)
AS
Begin
SELECT @asset
FROM RTO_weeklyanalysis
Where weekNumber = @weeknumber
END
基本上@asset将是列的名称,但这将根据用户在页面上选择的内容而改变。
答案 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