2017-05-10 73 views
1

我有一个名为Employee.emp.Language的表,其中包含可在UI上选择的语言列表。我无法向此表添加记录,也无法直接编辑UI来解决我的问题。TSQL在子查询中的联盟

我需要一个选项添加到我的查询,增加了NULL到我的结果集。这实际上将允许用户从下拉列表中选择null

DECLARE @nulls AS TABLE (fieldLabel VARCHAR(10) NULL, fieldValue VARCHAR(10) 

NULL) 
INSERT INTO @nulls(fieldLabel, fieldValue) 
VALUES ('NULL', NULL) 

SELECT 
(
     SELECT LanguageName AS FieldLabel, 
       LanguageID AS FieldValue 
     FROM Employee.emp.Language 
     WHERE IsRetired = 0 
     UNION 
     SELECT fieldLabel , 
       fieldValue 
      FROM @nulls 
    FOR XML PATH ('options'), ELEMENTS, TYPE, ROOT ('languages') 
) 

虽然我的列表中包含null选项选择在我的下拉,我有麻烦这段代码保存到我的存储过程。

我得到的错误是:The FOR XML clause is invalid in views, inline functions, derived tables, and subqueries when they contain a set operator. To work around, wrap the SELECT containing a set operator using derived table syntax and apply FOR XML on top of it.

只要我删除unionselect跟随它,一切工作正常。

我还能怎样完成增加值到结果集而不将其添加到直接表?

+0

为什么必须是 '空'。 NULL =未知。您可以向Employee.emp.Language表中插入一条记录,其中LanguageName ='Unknown'。 – Wendy

+0

@Wendy - 我无法通过添加此记录来修改源表。我正在为一个小型解决方案破解一个解决方案,其中99%的时间,NULL不会是一个可选择的选项,也不会出现在列表中。 – SBB

回答

2

使用它作为一个子查询,而你并不需要一个表值,你可以使用select空值。

create table lang(fieldlabel varchar(10), fieldvalue varchar(20)); 
insert into lang values 
('en', 'english'), 
('fr', 'french'); 

select fieldlabel, fieldvalue 
from (select fieldlabel, fieldvalue 
     from lang 
     union all 
     select null as fieldlabel, null as fieldvalue) l 
FOR XML PATH ('options'), ELEMENTS, TYPE, ROOT ('languages') 
GO 
 
| (No column name)                                            | 
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 
| <languages><options><fieldlabel>en</fieldlabel><fieldvalue>english</fieldvalue></options><options><fieldlabel>fr</fieldlabel><fieldvalue>french</fieldvalue></options><options /></languages> | 

dbfiddle here

+0

这很好 - 我不能弄清楚的一件事是如何在此场景中添加一个order by子句。尝试按照顺序排列lang表,最后以null结尾。目前,null最后会出现,但结果没有顺序。当我尝试添加一个时,出现错误:“除非指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。” – SBB

+0

您可以通过添加命令它'百强percent' http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=de44a83c0e6f8caa5ccaa9007bb961a4 – McNets

+0

谢谢,我给一个镜头,但由于某些原因,订单仍然不正确。我试图在查询中添加更多的示例来测试它,但我看不到如何编辑它。您的小提琴以相同的顺序显示结果,因此我只是想添加一些以查看您的排序是否正确。 – SBB

0

尝试直接插入空值而不是使用单独的表。尝试:

UNION ALL SELECT 'PCS','LTR','1' 

How to use union all with manual value (not from another tabel)?

注:编辑答案

+0

他插入的 “空” 的字符串和一个空值插入值字段'INSERT INTO @nulls( \t FieldLabel联合 \t,fieldValue方法 \t) VALUES( \t 'NULL' \t,NULL \t)' – Aron