我正在嘗試創建一個存盤程序,該程序回傳基于用戶輸入年份的結果。假設用戶選擇 2016 年的開始年份和 2018 年的結束年份,存盤程序將回圈這些年份以回傳結果。但是,我只需要 select 來回圈遍歷幾列。
例如,我正在尋找類似于下面背后的邏輯的東西。
SELECT
column A, column B
WHILE (@CurrentYr <= @MaxYr)
BEGIN
,CASE WHEN(Year = @CurrentYr THEN, columnC)
SET @CurrentYr = @CurrentYr 1
END
FROM
Table1
這將回傳列
ColumnA, ColumnB, 2016's ColumnC, 2017's ColumnC, 2018's Column8
這可能嗎?
謝謝
uj5u.com熱心網友回復:
這是一個代碼示例,它創建一個帶有基本列的臨時表“#MyTemp”,然后有一個回圈來根據當前年份和最大年份變數為年份添加其他列。使用動態 SQL 添加每一列后,您可以使用其他動態 SQL 使用資料更新該列。
DECLARE @YearCurrent int
DECLARE @YearMax int
DECLARE @YearCounter INT
DECLARE @ColumnName VARCHAR(20)
DECLARE @Sql varchar(100)
SELECT @YearCurrent = 2018
SELECT @YearMax = 2021
SELECT SettingID AS ColumnA, SettingValue AS ColumnB
INTO #MyTemp
FROM ApplicationSetting
SELECT @YearCounter = @YearCurrent
WHILE @YearCounter <= @YearMax
BEGIN
SELECT @ColumnName = 'Year_' CAST(@YearCounter AS VARCHAR(20))
SELECT @SQL = 'ALTER TABLE #MyTemp ADD [' @ColumnName '] VarChar(100) NULL '
PRINT @SQL
EXEC ( @SQL )
SELECT @SQL = 'UPDATE #MyTemp SET ' @ColumnName '= OrderHeader.SomeColumn FROM OrderHeader WHERE #MyTemp.ColumnA = OrderHeader.ColumnA'
PRINT @SQL
EXEC ( @SQL )
SELECT @YearCounter = @YearCounter 1
END
SELECT * FROM #MyTemp
我不確定您想在年份列中放入什么,但更新陳述句為您提供了基本概念,您可以根據需要調整更新陳述句。
樣本輸出

uj5u.com熱心網友回復:
不能WHILE在SELECT陳述句中使用。但是,這里有一種模式可以幫助您構建動態模式:
DECLARE @CurrentYr int = 2019, @MaxYr int = 2021, @sql varchar(MAX);
SELECT @sql = 'SELECT columnA, columnB, ' (
SELECT STRING_AGG (
CASE YearIncrement
WHEN 0 THEN CONCAT ( 'columnC AS Year_', @CurrentYr YearIncrement )
WHEN 1 THEN CONCAT ( 'columnD AS Year_', @CurrentYr YearIncrement )
WHEN 2 THEN CONCAT ( 'columnE AS Year_', @CurrentYr YearIncrement )
-- WHEN...etc
END
, ', '
) AS cols
FROM (
SELECT
ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL ) ) - 1 AS YearIncrement
FROM STRING_SPLIT ( ( SELECT REPLICATE ( ',', @MaxYr - @CurrentYr ) ), ',' )
) AS x
)
' FROM Table1;';
PRINT @sql;
印刷
SELECT columnA, columnB, columnC AS Year_2019, columnD AS Year_2020, columnE AS Year_2021 FROM Table1;
通過使用組合
REPLICATE(根據年份差異創建逗號串列)STRING_SPLIT(將所述逗號串列拆分為行)ROW_NUMBER(提供一個數字(-1 以從零開始增量)以添加到所述行上的每一年)STRING_AGG(將它們全部組合回以逗號分隔的串列)
我們可以創建一個可以執行的動態 SQL 陳述句。不幸的是,我不知道針對這些CASE情況的解決方法,因為您的列名會有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344768.html
標籤:sql sql-server 循环
