2017-05-10 20 views
1

UIで選択する言語のリストを含むEmployee.emp.Languageというテーブルがあります。私はこのテーブルにレコードを追加することができず、自分の問題を解決するためにUIを直接編集できません。サブクエリのTSQL Union

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オプションが含まれていますが、私は、ストアドプロシージャの中に保存するために、コードのこの部分を取得する問題を抱えています。

私は取得していますエラーは次のとおりです、とすぐに私はそれ以下のunionselectを削除するよう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.

すべてが正常に動作します。

他にどのようにして結果セットをテーブルに直接追加することなく値を追加できますか?

+0

なぜ 'NULL' でなければなりません。 NULL =不明です。 Employee.emp.Language表LanguageName = 'Unknown'にレコードを挿入できます。 – Wendy

+0

@Wendy - このレコードを追加してソーステーブルを変更できません。私は時間の他の99%、NULLが選択可能でないか、リストに表示されないオプションである小さな回避策のための解決策をハッキングしています。彼は "NULL" の文字列と値フィールドにNULL値を挿入さ – SBB

答えて

2

サブクエリとしてそれを使用して、あなたは大切なテーブルを必要としない、あなたはヌル値で選択を使用することができます。

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句を追加する方法はわかりませんが、私が把握できないことは1つです。最後にヌルを付けてlangテーブルで昇順で注文しようとしています。現在、nullは最後に来ますが、結果には順序がありません。 "ORDER BY句は、TOP、OFFSETまたはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。" – SBB

+0

あなたは 'top 100 %'を追加して注文することができますhttp://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=de44a83c0e6f8caa5ccaa9007bb961a4 – McNets

+0

ありがとう、私はそのショットを与えましたが、何らかの理由で注文は間違ったままです。私はそれをテストするためにあなたのクエリにいくつかの例を追加しようとしましたが、私はそれを編集する方法を見ることができませんでした。あなたのフィドルが結果が入っているのと同じ順序で表示されているので、ちょうどあなたのものが正しくソートされているかどうかを確認するためにもう少し追加したいと思っています。 – SBB

0

別のテーブルを使用する代わりに、null値を直接挿入してみてください。試してみてください:

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

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

注から:編集答え

+0

''( \tのfieldLabel \t fieldValueの \t)@nulls INTO( \t NULL \t 'NULL' \t) 値を挿入 – Aron