子查询中的TSQL联合

子查询中的TSQL联合,sql,sql-server,sql-server-2008,tsql,stored-procedures,Sql,Sql Server,Sql Server 2008,Tsql,Stored Procedures,我有一个名为Employee.emp.Language的表,其中包含可在UI上选择的语言列表。我无法将记录添加到此表,也无法直接编辑UI以解决我的问题 我需要在查询中添加一个选项,将NULL添加到结果集中。这本质上允许用户从下拉列表中选择null DECLARE @nulls AS TABLE (fieldLabel VARCHAR(10) NULL, fieldValue VARCHAR(10) NULL) INSERT INTO @nulls( fieldLabel, fieldValu

我有一个名为Employee.emp.Language的表,其中包含可在UI上选择的语言列表。我无法将记录添加到此表,也无法直接编辑UI以解决我的问题

我需要在查询中添加一个选项,将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选项,但我很难将这段代码保存到存储过程中

我得到的错误是:当视图、内联函数、派生表和子查询包含set运算符时,FOR XML子句在这些视图、内联函数、派生表和子查询中无效。要解决此问题,请使用派生表语法包装包含set运算符的SELECT,并在其上应用XML

一旦我删除了联合体和它后面的select,一切正常


否则,如何在不直接将值添加到表中的情况下将值添加到结果集中?

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

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


注意:已编辑的答案将其用作子查询,并且您不需要表值,您可以使用带有空值的select


dbfiddle

他正在向值字段插入一个Null字符串和一个Null值插入@nulls fieldLabel,fieldValue VALUES'Null',Null为什么必须为'Null'。空=未知。您可以在表Employee.emp.Language中插入一条记录,该记录的LanguageName='Unknown'。@Wendy-我无法通过添加此记录来修改源表。我正在为一个小的解决方案设计一个解决方案,在这个解决方案中,另外99%的时间,NULL将不是一个可选择的选项,也不会出现在列表中。这个解决方案非常有效-但我不知道的一件事是如何在这个场景中添加orderby子句。尝试按lang表按asc顺序排序,结尾为null。目前,null确实排在最后,但结果没有顺序。当我尝试添加一个时,我得到了一个错误:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。您可以通过添加TOP 100%对其进行排序谢谢,我尝试了一下,但由于某些原因,顺序仍然不正确。我试图向您的查询中添加一些示例来测试它,但我看不出如何编辑它。你的fiddle以与结果相同的顺序显示,因此我只想再添加一些,以查看你的排序是否正确。请将链接发布到dbfiddle,我将尝试解决它。我刚刚解决了这个问题。实际上,我将顺序移到了外部选择,效果非常好。
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> |