2017-05-10 167 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