2016-12-28 122 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 
相关问题