SQL SELECT Динамические имена столбцов - PullRequest
0 голосов
/ 22 ноября 2018

Есть ли способ в 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

У меня есть такая таблица:

enter image description here

Идея состоит в том, чтобы запустить цикл while и получить конкретные значенияиз таблицы (все 10) один за другим и установите их в качестве значения некоторого компонента.

Если есть другой, более простой и изощренный способ сделать это, пожалуйста, скажите мне.

Код Expanede:

 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

Я должен получить значение из столбцов иприсвойте значение меткам Check1..2..3 (в основном их переименуйте)

enter image description here

1 Ответ

0 голосов
/ 22 ноября 2018

Это дублирует ваш 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...