问题描述
假设我有一个包含名称为 AMT_0
,AMT_1
,..AMT_49
的 50 列的表。是否有可能取决于变量的动态列数总和。
example1:SELECT SUM(AMT_0,AMT_1,AMT_2,AMT_3) FROM TBL
其中变量等于 4。
example2:SELECT SUM(AMT_0,..,AMT_23) FROM TBL
其中变量等于 24。
解决方法
理想情况下,您应该重新设计您的数据库,以便将 AMT
规范化为行。这样查询就简单得多,并且不需要动态 SQL。
目前唯一的方法是使用动态 SQL,您需要确保通过在系统表中查找所有列来检查它们是否存在,并正确引用所有列名:
DECLARE @sql nvarchar(max) = N'
SELECT SUM(
' +
(
SELECT STRING_AGG(QUOTENAME(c.name),N',')
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(N'TBL')
AND c.name LIKE N'AMT_%'
) + N'
)
FROM TBL
';
EXEC (@sql)
,
您需要构建一些动态 SQL。这样的事情应该可以解决问题
DECLARE @var smallint;
SELECT @var = 15; -- change variable value to control # of columns summed
DECLARE @sql varchar(4000);
DECLARE @cntr smallint; -- incremental counter variable for WHILE loop
SELECT @sql = '';
SELECT @cntr = 1;
WHILE @cntr > 0 AND @cntr <= 50 AND @cntr <= @var
BEGIN
IF @sql = ''
BEGIN
SELECT @sql = 'SELECT SUM(AMT_0';
END
ELSE
SQL @sql += ' + AMT_' + CONVERT(varchar(10),(@cntr-1));
END
SELECT @cntr += 1;
END
SELECT @sql += ') FROM TBL;';
EXEC (@sql);