[英]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.