Динамический TSQL CASE и не отображаемая таблица не в списке через запятую - PullRequest
0 голосов
/ 05 июня 2018

Привет всем, что я делаю несколько динамический запрос и у меня есть CASE в моих операторах выбора, например, так:

DECLARE @valueList varchar(8000)
DECLARE @pos int
DECLARE @len int
DECLARE @value varchar(8000)
SET @valueList = 'Description,hardwarePartNumber,poc,'

BEGIN
    SET @len = CHARINDEX(',', @valueList, @pos+1) - @pos
    SET @value = SUBSTRING(@valueList, @pos, @len)
SELECT 
    CAST(CASE WHEN @value = 'Description' THEN 
         BL.Description END AS varchar)                 AS 'Description',
    CAST(CASE WHEN @value = 'hardwarePartNumber' THEN 
         BL.hardwarePartNumber END AS varchar)          AS 'hardwarePartNumber',
    CAST(CASE WHEN @value = 'poc' THEN 
         UT.lastFirstMiddle END AS int)                 AS 'poc',
    CAST(CASE WHEN @value = 'quantity' THEN 
         BL.quantity END AS int)                        AS 'quantity',
      etc...etc....
FROM 
    bLine                  AS BL 
INNER JOIN usersTbl        AS UT 
    ON BL.poc              = UT.id
      etc...etc....

Это работает нормально, но помещаетимена таблиц в результате, даже если у него не было имени таблицы в списке , разделенных запятыми *1009*.

Так что для приведенного выше примера результат будет выглядеть следующим образом:

Description    |hardwarePartNumber |poc        |quantity
--------------------------------------------------------
something here |568FHT             |Bob Barker |NULL
another thing  |GT43643            |Steve Jobs |NULL
Hey hey hey    |DSTN345            |Fat Albert |NULL

Обратите внимание, как количество равно NULL , поскольку оно не было найдено в списке * 109 *, разделенных запятыми .Я хочу, чтобы он выглядел следующим образом:

Description    |hardwarePartNumber |poc
-----------------------------------------------
something here |568FHT             |Bob Barker
another thing  |GT43643            |Steve Jobs
Hey hey hey    |DSTN345            |Fat Albert

Так что, если его нет в списке через запятую , не отображайте таблицу в конечном запросе.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вот ответ:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp

SELECT CAST(BL.Description AS varchar) AS 'Description',
    CAST(  BL.hardwarePartNumber AS varchar)            AS 'hardwarePartNumber',
    CAST(UT.lastFirstMiddle END AS int)                 AS 'poc',
    CAST(BL.quantity END AS int)                        AS 'quantity',
      etc...etc....

INTO #Temp
FROM 
    bLine                  AS BL 
INNER JOIN usersTbl        AS UT 
    ON BL.poc              = UT.id
      etc...etc....

DECLARE @valueList varchar(8000)
SET @valueList = 'Description,hardwarePartNumber,poc,'

DECLARE @SQL varchar(max) = 'SELECT ' + LEFT(@valuelist,LEN(@valuelist)-1 + ' FROM #Temp'    
EXEC(@SQL)
0 голосов
/ 05 июня 2018

Продолжение стиля и т. Д. - используйте CROSS APPLY и STRING_SPLIT:

Select distinct
    ..
    compare BL columns against BL2.value
    ..

FROM 
    bomLine                AS BL 
    cross apply STRING_SPLIT ('Description,hardwarePartNumber,poc,', ',') BL2
...