动态 SQL 未捕获所有列
Dynamic SQL not Capturing all Columns
我正在尝试捕获一组列,但该组列可能会根据相关数据发生变化(每个月都会发生变化)。因此,我正在研究一种方法来捕获 Service 列中的不同值,并将以逗号分隔的列名放入一个变量中,以便稍后调用。这是代码(仅分析重要内容)。
DECLARE @cols AS NVARCHAR(MAX);
SELECT @cols = ISNULL(@cols + ',','') + QUOTENAME([Service])
FROM(
SELECT DISTINCT Billing_Table.[Service]
FROM Billing_Table
) AS Services;
问题是当我 运行
SELECT DISTINCT Billing_Table.[Service]
FROM Billing_Table
就其本身而言,我获得了列出的所有不同服务(这很好,这正是我所期待的)。但是变量 @cols
并不包含所有相同的列,这并不好。
这是什么原因?我可以修改什么来解决这个问题?
您的代码不起作用的原因是您递归地使用了变量@cols。它不会像 SQL 那样工作。 (据我所知,T-SQL 中的递归必须通过 CTE 完成)。
试试这个
SELECT @cols = STUFF((
SELECT DISTINCT CONCAT(',',[Service]) FROM Billing_table
FOR XML PATH(''),type).value('.','NVARCHAR(MAX)'),1,1,'')
测试:
DECLARE @tmp TABLE (
ID INT
);
DECLARE @cols NVARCHAR(MAX);
INSERT INTO @tmp (ID)
VALUES
(1), (2), (3);
SELECT @cols = STUFF((
SELECT DISTINCT CONCAT(',',ID) FROM @tmp
FOR XML PATH(''),type).value('.','NVARCHAR(MAX)'),1,1,'')
SELECT @cols;
我正在尝试捕获一组列,但该组列可能会根据相关数据发生变化(每个月都会发生变化)。因此,我正在研究一种方法来捕获 Service 列中的不同值,并将以逗号分隔的列名放入一个变量中,以便稍后调用。这是代码(仅分析重要内容)。
DECLARE @cols AS NVARCHAR(MAX);
SELECT @cols = ISNULL(@cols + ',','') + QUOTENAME([Service])
FROM(
SELECT DISTINCT Billing_Table.[Service]
FROM Billing_Table
) AS Services;
问题是当我 运行
SELECT DISTINCT Billing_Table.[Service]
FROM Billing_Table
就其本身而言,我获得了列出的所有不同服务(这很好,这正是我所期待的)。但是变量 @cols
并不包含所有相同的列,这并不好。
这是什么原因?我可以修改什么来解决这个问题?
您的代码不起作用的原因是您递归地使用了变量@cols。它不会像 SQL 那样工作。 (据我所知,T-SQL 中的递归必须通过 CTE 完成)。
试试这个
SELECT @cols = STUFF((
SELECT DISTINCT CONCAT(',',[Service]) FROM Billing_table
FOR XML PATH(''),type).value('.','NVARCHAR(MAX)'),1,1,'')
测试:
DECLARE @tmp TABLE (
ID INT
);
DECLARE @cols NVARCHAR(MAX);
INSERT INTO @tmp (ID)
VALUES
(1), (2), (3);
SELECT @cols = STUFF((
SELECT DISTINCT CONCAT(',',ID) FROM @tmp
FOR XML PATH(''),type).value('.','NVARCHAR(MAX)'),1,1,'')
SELECT @cols;