组合SQL Server Stuff语句以获取单行

时间:2016-09-06 08:20:17

标签: sql sql-server tsql

我有一个有趣的问题。我有两个T-SQL STUFF语句。在这个例子中,我使用了union。这会将结果显示为两行。

我想要做的是组合这些结果,使其返回单行。我正在使用SQL Server 2008 R2。该解决方案应该能够使用stuff语句进行复制,返回null。

有没有办法实现这个目标?

这是代码

SELECT
    (SELECT
         STUFF((SELECT (' ' + mod_orders.mod_no + '<br>')
                FROM mod_serials
                INNER JOIN mod_orders ON mod_serials.mod_id = mod_orders.mod_id
                INNER JOIN mod_order_items ON mod_orders.mod_id = mod_order_items.mod_id AND mod_order_items.item_id = 170
                WHERE     
                    (mod_serials.serial_id = 62 AND 
                     mod_serials.date_implemented IS NOT NULL)
                ORDER BY mod_serials.serial_id 
                FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, ''))
UNION

SELECT
    (SELECT     
         STUFF((SELECT (' ' + char_data_mv.char_value + '<br>')
                FROM char_data_mv
                WHERE (char_data_mv.object_id = 62 AND char_data_mv.char_id = 177)
                ORDER BY char_data_mv.row_id 
                FOR XML PATH(''), TYPE ).value('.','nvarchar(max)'), 1, 1, '')) as [Impl]

示例数据:

Row1 - 00001<br> 00005<br>
Row2 - PMB 12345<br>

综合结果将是:

00001<br> 00005<br> PMB 12345<br>

1 个答案:

答案 0 :(得分:0)

UNION语句返回第一个表中的所有行,然后将第二个表中的所有行一起返回到一个大表中 - 这就是为什么要获得2行。

相反,您只需将两个字符串与&#39; +&#39;一起添加即可。运营商。如果另一个为null,您还希望返回一个字符串,并添加空值begets nulls。因此,请使用ISNULL函数来提供空字符串。

SELECT
ISNULL((SELECT     STUFF
((SELECT     
(' ' + mod_orders.mod_no + '<br>')
FROM         mod_serials
INNER JOIN mod_orders ON mod_serials.mod_id = mod_orders.mod_id
INNER JOIN mod_order_items ON mod_orders.mod_id = mod_order_items.mod_id AND mod_order_items.item_id = 170
WHERE     (mod_serials.serial_id = 62 AND mod_serials.date_implemented IS NOT NULL)
ORDER BY mod_serials.serial_id FOR XML PATH(''), TYPE ).value('.', 'nvarchar(max)'), 1, 1, '')),'')
+
ISNULL((SELECT     STUFF
((SELECT     
(' ' + char_data_mv.char_value + '<br>')
FROM         char_data_mv
WHERE     (char_data_mv.object_id = 62 AND char_data_mv.char_id = 177)
ORDER BY char_data_mv.row_id FOR XML PATH(''), TYPE ).value('.','nvarchar(max)'), 1, 1, '')),'') as [Impl]

请注意,您需要删除UNION以及之后的第一个SELECT - 这是创建第二个表格。