簡體   English   中英

SQL SELECT動態列名稱

[英]SQL SELECT Dynamic column names

MS SQL中有什么方法可以創建這樣的動態選擇查詢嗎?

    DECLARE @cnt INT = 1
    DECLARE @value NVARCHAR(25)
    DECLARE @query  AS NVARCHAR(MAX)
    DECLARE @part NVARCHAR(25) = 'W11282173'

            WHILE @cnt <= 10
                BEGIN
                       Set @query = N'SELECT Check'+str(@cnt)+ N' from udtSmartPlastic where Partnumber ='+@part
                       exec sp_executesql @query;
                       SET @cnt = @cnt + 1
                END

我有這樣的表:

在此處輸入圖片說明

這個想法是運行一個while循環,並一一從表(所有10個表)中獲取特定值,並將其設置為某個組件的值。

如果有另一種更簡單,更復雜的方法可以告訴我。

驗證碼:

 DECLARE @cnt INT = 1
 DECLARE @value NVARCHAR(25)
 DECLARE @query  AS NVARCHAR(MAX)
 DECLARE @part NVARCHAR(25) = 'W11282173'
                        WHILE @cnt <= 10
                            BEGIN
                              set @query = N'SELECT Check'+str(@cnt)+ N' from udtSmartPlastic where Partnumber ='+@part
                              exec sp_executesql @query;
                              --SELECT Check+str(1) from udtSmartPlastic where PartNumber = 'W11282173'
                              INSERT INTO @TblReturn VALUES ('txtCheck'+str(@cnt), 'Property', '<property Value='+@value+'/>')
                              SET @cnt = @cnt + 1
                            END

我必須從Columns中獲取值並分配標簽Check1..2..3的值(基本上將其重命名)

在此處輸入圖片說明

這復制了您擁有的SQL,但是,我不太了解為什么要這樣做:

DECLARE @SQL nvarchar(MAX);
DECLARE @Part nvarchar(25) = 'W11282173'

WITH Tally AS (
    SELECT I
    FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) V(I))
SELECT @SQL = STUFF((SELECT NCHAR(10) + N'SELECT ' + QUOTENAME(N'CHECK' + CONVERT(nvarchar(2),T.I)) + N' FROM udtSmartPlastic WHERE Partnumber = @dPart;'
                     FROM Tally T
                     FOR XML PATH(N'')),1,1,N'');

PRINT @SQL;
EXEC sys.sp_executesql @SQL, N'@dPart nvarchar(25)',@dPart = @Part;

請注意,我已將您的查詢從一個開放查詢更改為一個參數化查詢。 注射離您的朋友很遠,您應該盡一切努力使某人無法做到。

編輯:至於規范化您的數據; 您可以通過以下方法輕松實現:

SELECT SP.PartNumber,
   CHOOSE(T.I,Check1,Check2,Check3,Check4,Check5,Check6,Check7,Check8,Check9,Check10) AS CheckValue
--INTO udtSmartPlasticn
FROM udtSmartPlastic SP
     CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) T(I);

暫無
暫無

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

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