2016-12-28 120 views
0

我正在使用SQL Server 2012.我需要將來自以下查詢的結果連接成一個長字符串。所以,而不是獲得行結果,我只需要一個字符串。我想用結果填充@TEMPS_MEASURE。從查詢結果而不是行中獲取字符串

目前,結果是這樣的:

enter image description here

取而代之的是,我願與列之間<br/>只返回一個字符串,像這樣:

H 1 topla kuhinja (2 - 6 °C):<br/>Temperatura: 5.00°C<br/>H 2 hladna kuhinja (2 - 6 °C):<br/>Temperatura: 4.00°C<br/> 

我應該如何改變查詢?

查詢:

DECLARE @TEMPS_MEASURE NVARCHAR(500) = NULL 
SELECT 
CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN NULL ELSE COLI.COLI_NME + ':<br/>' END AS EQ_NAME 
, CASE HATE.HATE_TE1 WHEN NULL THEN NULL ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C<br/>' END AS TEMP 
, CASE HATE.HATE_AC1 
     WHEN NULL THEN NULL 
     WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo<br/>' 
     WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*)<br/>' 
     WHEN '3' THEN 'Ukrep: Dodatno ogrejemo<br/>' 
    END ACTION_UPON 
, CASE HATE.HATE_TE2 WHEN NULL THEN NULL ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C<br/>' END AS TEMP_CENTER 
FROM CAHATE HATE 
INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
WHERE HACC_KEY = 160001417 

SOLUTION:

我創建函數FOR XML PATH:

ALTER FUNCTION dbo.f_CAHATE_Get_Temperatures (@iHACC_KEY INTEGER) 
RETURNS NVARCHAR(500) 
AS BEGIN 



DECLARE @TEMPS_MEASURE NVARCHAR(500) = NULL 
SELECT @TEMPS_MEASURE = (SELECT 
    CONCAT(
     (CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN '' ELSE COLI.COLI_NME + ':' END) 
     , (CASE HATE.HATE_TE1 WHEN NULL THEN '' ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C;' END) 
     , (CASE HATE.HATE_AC1 
       WHEN NULL THEN '' 
       WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo;' 
       WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*);' 
       WHEN '3' THEN 'Ukrep: Dodatno ogrejemo;'   
      END) 
     , (CASE HATE.HATE_TE2 WHEN NULL THEN '' ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C;' END) 
    ) 
FROM 
    CAHATE HATE 
    INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
WHERE 
    HACC_KEY = @iHACC_KEY 
    for xml path('')) 


    RETURN @TEMPS_MEASURE 
END 
+0

爲什麼downvoting?問題有問題嗎?有什麼遺漏? – FrenkyB

+0

您的選擇查詢將返回包含4列的結果,您希望如何格式化返回的值?注:我不是downvoter –

+0

我把
之間。 – FrenkyB

回答

2

您還可以使用CONCAT函數,因爲它是在SQL Server 2012中引入的,以將不同的字符串值合併爲一個。它還處理不同的數據類型以轉換爲字符串類型。所以,你不會有類型不匹配的異常。

SELECT 
    CONCAT(
     (CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN '' ELSE COLI.COLI_NME + ':<br/>' END) 
     , (CASE HATE.HATE_TE1 WHEN NULL THEN '' ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
     , (CASE HATE.HATE_AC1 
       WHEN NULL THEN '' 
       WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo<br/>' 
       WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*)<br/>' 
       WHEN '3' THEN 'Ukrep: Dodatno ogrejemo<br/>'   
      END) 
     , (CASE HATE.HATE_TE2 WHEN NULL THEN '' ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
    ) 
FROM 
    CAHATE HATE 
    INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
WHERE 
    HACC_KEY = 160001417 
+0

這有效,唯一的問題是有幾行返回(在這些行中,字符串被正確連接)。也可以連接這些行嗎?因此,而不是許多行,只返回一個長字符串。 – FrenkyB

+0

是的,這是可能的。我在下面的答案中添加了它。 –

+0

對不起,我沒有看到你第二個答案? – FrenkyB

1

你需要你列的4相結合

SELECT 
(CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN '' ELSE COLI.COLI_NME + ':<br/>' END) 
+ (CASE HATE.HATE_TE1 WHEN NULL THEN '' ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
+ (CASE HATE.HATE_AC1 
     WHEN NULL THEN '' 
     WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo<br/>' 
     WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*)<br/>' 
     WHEN '3' THEN 'Ukrep: Dodatno ogrejemo<br/>'   
    END) 
+ (CASE HATE.HATE_TE2 WHEN NULL THEN '' ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
FROM CAHATE HATE 
INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
WHERE HACC_KEY = 160001417 

注:我將When NULL then NULL更改爲When NULL then ''以確保「+」正常工作。

+0

我正在接收來自此查詢的兩個空行的一列。 – FrenkyB

+1

@FrenkyB,這個想法是你需要將列連接在一起,並確保其中不會有NULL值,否則最終結果將爲NULL。這只是對您的查詢的快速更改,我沒有對其進行測試。 –

0

請嘗試以下查詢。 COALESCE是SQL提供的功能,可以解決您的問題。

我首先將所有列逐行連接,然後使用COALESCE將行轉換爲一行。

select * into #Temp 
from 
(
    select (isnull(EQ_Name,'')+isnull(Temp,'')+isnull(Action_Upon,'')+isnull(TempCenter,''))as data 
    from CAHATE 
) as TempData 

DECLARE @result nVARCHAR(MAX) 

SELECT @result = COALESCE(@result + ', ' + [data], [data]) 
FROM #Temp 

PRINT @result 

Drop Table #Temp 
0

下面是一個例子:

;WITH T AS 
( 
    SELECT  
     1 AS Id, 
     CONCAT(
      (CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN '' ELSE COLI.COLI_NME + ':<br/>' END) 
      , (CASE HATE.HATE_TE1 WHEN NULL THEN '' ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
      , (CASE HATE.HATE_AC1 
        WHEN NULL THEN '' 
        WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo<br/>' 
        WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*)<br/>' 
        WHEN '3' THEN 'Ukrep: Dodatno ogrejemo<br/>'   
       END) 
      , (CASE HATE.HATE_TE2 WHEN NULL THEN '' ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C<br/>' END) 
     ) AS String 
    FROM 
     CAHATE HATE 
     INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
    WHERE 
     HACC_KEY = 160001417 
) 

SELECT 
    STUFF((SELECT '; ' + US.String 
      FROM T US 
      WHERE US.Id = SS.Id 
      FOR XML PATH('')), 1, 1, '') [FinalString] 
FROM T SS 
GROUP BY SS.Id, SS.String 
ORDER BY 1 

可以刪除隔板;如果不需要,可以使用

0

如上所述,這是問題的解決方案。 我創建了功能FOR XML PATH:

ALTER FUNCTION dbo.f_CAHATE_Get_Temperatures (@iHACC_KEY INTEGER) 
RETURNS NVARCHAR(500) 
AS BEGIN 



DECLARE @TEMPS_MEASURE NVARCHAR(500) = NULL 
SELECT @TEMPS_MEASURE = (SELECT 
    CONCAT(
     (CASE WHEN HATE.HATE_TE1 IS NULL AND HATE.HATE_AC1 IS NULL AND HATE.HATE_TE2 IS NULL THEN '' ELSE COLI.COLI_NME + ':' END) 
     , (CASE HATE.HATE_TE1 WHEN NULL THEN '' ELSE 'Temperatura: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE1,2,0) AS NUMERIC(10,2))) + '°C;' END) 
     , (CASE HATE.HATE_AC1 
       WHEN NULL THEN '' 
       WHEN '1' THEN 'Ukrep: Zavržemo jed/živilo;' 
       WHEN '2' THEN 'Ukrep: Izmerimo središčno temperaturo jedi/živila (TS*);' 
       WHEN '3' THEN 'Ukrep: Dodatno ogrejemo;'   
      END) 
     , (CASE HATE.HATE_TE2 WHEN NULL THEN '' ELSE 'Temperatura središča: ' + CONVERT(VARCHAR(20), CAST(ROUND(HATE.HATE_TE2,2,0) AS NUMERIC(10,2))) + '°C;' END) 
    ) 
FROM 
    CAHATE HATE 
    INNER JOIN CACOLI COLI ON COLI.COLI_KEY = HATE.COLI_KEY 
WHERE 
    HACC_KEY = @iHACC_KEY 
    for xml path('')) 


    RETURN @TEMPS_MEASURE 
END 
相關問題