簡體   English   中英

為存儲過程中的變量賦值

[英]Assign values to variables in stored procedure

 select  @numOfColumns =  count(distinct Col) from #b
 SET @sql2=
'SELECT'+ @columns +'+= QUOTENAME(Col) + '',''
 from (SELECT DISTINCT top @numOfColumns Col FROM #b ORDER BY Col) A';

 EXECUTE sp_executesql @sql2;

我試圖讓這個存儲過程工作。 嘗試將 @numOfColumns 傳遞給語句,然后將 QUOTENAME(Col) 中的值分配給 @columns,然后執行語句。

腳本

DECLARE 
@columns NVARCHAR(MAX) = '',
@sql     NVARCHAR(MAX) = '',
 @sql2     NVARCHAR(MAX) = '',
@numOfColumns int = 0;

SELECT customerid, curbal,  Col = CAST (ROW_NUMBER() OVER (PARTITION BY 
convert(int,customerid) ORDER BY convert(float,curbal) desc) as int)
into #b
FROM [sav acc]

select  @numOfColumns =  count(distinct Col) from #b

SET @sql2= 'SELECT '+ @columns+' += QUOTENAME(Col) + '','' from (SELECT 
DISTINCT top (@numOfColumns) Col FROM #b ORDER BY Col) A';

EXECUTE sp_executesql @sql2, N'@numOfColumns', @numOfColumns int;

這是帖子的起源。 原帖 該解決方案確實有效,但我使用源數據對其進行了測試,它會將列定位在 [3], [2], 1並且我希望這些列為1 ,[2],[3]

首先,您使用TOP方式毫無意義。 如果您在#b有 5 個不同的Col值,則SELECT DISTINCT Col FROM #b將只返回 5 個記錄,無論您是否應用TOP 5 似乎您只使用它來允許排序,但您可以將排序放在外部查詢中。

其次,您不應該使用變量賦值來連接字符串, 這種行為是不可靠STRING_AGG 記錄的,您應該使用STRING_AGG ,或者對於早期版本的 SQL Server,您可以利用XML擴展,或者:

CREATE TABLE #B (Col CHAR(1));
INSERT #B (Col) VALUES ('A'), ('A'), ('B'), ('C');

DECLARE @Columns NVARCHAR(MAX) = 
    (   SELECT  STRING_AGG(QUOTENAME(Col), ',') WITHIN GROUP (ORDER BY Col)
        FROM    (SELECT DISTINCT Col FROM #B) AS b
    );

或者

DECLARE @Columns NVARCHAR(MAX) = 
        STUFF(( SELECT  CONCAT(',', QUOTENAME(Col))
                FROM    #B
                GROUP BY Col
                ORDER BY Col
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

雖然上面表明動態 sql 是不必要的,但如果您使用@top也沒有必要,您可以簡單地使用:

DECLARE  @numOfColumns INT = (SELECT count(distinct Col) from #b);
DECLARE @Columns NVARCHAR(MAX) = '';

SELECT  @Columns += QUOTENAME(Col) + ','
FROM    (SELECT DISTINCT TOP (@numOfColumns) Col FROM #B) AS b
ORDER BY Col;

SELECT @Columns;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM