动态 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;