子查询中的TSQL联合
我有一个名为Employee.emp.Language的表,其中包含可在UI上选择的语言列表。我无法将记录添加到此表,也无法直接编辑UI以解决我的问题 我需要在查询中添加一个选项,将NULL添加到结果集中。这本质上允许用户从下拉列表中选择null子查询中的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
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> |