T-SQL使用另一个标量变量的值设置标量变量

时间:2018-04-27 11:48:09

标签: sql tsql stored-procedures

我创建一个存储过程来检索数据以填充雷达图表。它使用静态表格和行如下工作得很好:

(这只是代码的一部分)

SELECT
   @aAvg = CAST(AVG(1. * foerderpy_1617) as DECIMAL(18,4)),
   @aMin = CAST(MIN(1. * foerderpy_1617) as DECIMAL(18,4)),
   @aMax = CAST(MAX(1. * foerderpy_1617) as DECIMAL(18,4))
FROM foerderpy a WHERE SUBSTRING(a.BSN,3,1) = 'g';

但现在我想要一个动态的SQL。我希望存储过程始终采用我表的最新一行:

(这些只是代码的一部分)

DECLARE @SQL AS NVARCHAR(MAX);
DECLARE @aAvg AS NVARCHAR(MAX);
DECLARE @aMin AS NVARCHAR(MAX);
DECLARE @aMax AS NVARCHAR(MAX);
DECLARE @tabname SYSNAME;
DECLARE @coluname SYSNAME;
DECLARE @counter INTEGER;

SET @tabname = 'foerderpy'

SET @counter = (
        SELECT MAX(ORDINAL_POSITION)
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = @tabname
        GROUP BY TABLE_NAME)

SET @coluname = (
        SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = @tabname AND
        ORDINAL_POSITION = @counter)

SET @aAvg = (SELECT CAST(AVG(1. * @coluname) as DECIMAL(18,4))FROM @tabname a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING(@restriction,3,1))

在最后一行(SET @aAvg),存储过程停止工作,sql告诉我“我必须声明@tabname”,尽管我obv。在上面宣布。我错过了什么问题?甚至可以做我想做的事情吗?

本守则的其余部分没有造成任何问题,所以我把它排除在外。我需要@aAvg稍后在程序中计算。

1 个答案:

答案 0 :(得分:0)

您需要使用EXECUTE运行上一个查询,因为EXECUTE

  

在Transact-SQL批处理中执行命令字符串或字符串

因此,您必须以查询以字符串形式写入并由execute调用的方式更改过程的最后一行。

DECLARE @sql VARCHAR(max) = 'SELECT CAST(AVG(1. * ' + @coluname + ') as DECIMAL(18,4))FROM '+ @tabname +' a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING('+@restriction+',3,1)';
EXECUTE(@sql);

如果您想将值保存在变量@aAvg中,可以sp_executesql使用out参数,这样:

DECLARE @sql VARCHAR(max) = 'SELECT CAST(AVG(1. * ' + @coluname + ') as DECIMAL(18,4))FROM '+ @tabname +' a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING('+@restriction+',3,1)';
exec sp_executesql @sql, N'@aAvg decimal(18,4) out', @aAvg out
select @aAvg