我创建一个存储过程来检索数据以填充雷达图表。它使用静态表格和行如下工作得很好:
(这只是代码的一部分)
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稍后在程序中计算。
答案 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