2017-10-10 11 views
-1
line1 SELECT 'A' 

line2 SELECT CONCAT(a,b); 

line3 SELECT 'B' 

SQL Serverは、その後line1に成功してきたはずです手続き型プログラミングの場合は、2行目で失敗によるバッチに、SQL Server 2008でこれを試すとline1が照会されないことがわかりました質問された権利?T-SQLの手続き型プログラミング

+3

SQLは手続き型言語ではありません...宣言型言語です。これは言語の基本的な基本概念の1つです...また、SQL Serverを使用している場合は何も印刷されません。a&bの一重引用符がないと、無効な列名エラーがスローされます。 –

+0

http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/(特に「Parsing and Compilation」の部分)を読んでください。基本的に、文の解析中にエラーが発生した場合、文では何も実行されません。 – ZLK

+1

このリンクは参考になる場合があります:https://stackoverflow.com/questions/2668529/what-is-a-batch-and-why-is-go-used特にQuassnoiから答えてください。 –

答えて

2

動作が観察される理由は、実行時エラーではなくコンパイル時エラーが発生するためです。 Hereはいくつかの違いがあるかもしれません。

データベースエンジンでコンパイル時エラーが発生すると、バッチ全体がまったく実行されず、コードが単一のバッチで構成されます。だからあなたは何の結果も見ないのです。ただし、これらのステートメントをgo(SSMS、sqlcmd、またはそれを認識する他のクライアント)で区切ると、2番目のステートメントだけがスキップされます。

0
SELECT 'A' 

T-SQLでは有効です。文字列のない結果としてAがそのまま表示されます。その機能は、単に利用できないので、しかし、そのクエリは、は、SQL 2008でAの値を保持する

SELECT CONCAT(a,b); 

と呼ばれるの参照を作成しないこれは動作しませんありません。この行はセミコロンで終了することにも注意してください。しかし、aとbのどちらも存在しませんが、唯一の前のコード行は永続的な参照を作成しないためです。 SQL 2008で

SELECT a + b; 

これはうまくいくかもしれない(場合、AとBの両方が存在していた文字列)

SELECT 'B' 

は、T-SQLで有効であり、それは文字通り、結果として、Bが表示されます列ヘッダーはありません。しかし、そのクエリは、ませが後を参照するために任意の名前の値を与えるものではありません

  1. SELECT 'A'簡単でB.

    の値を保持しているBと呼ばれる参照を作成しません。

  2. 連結が間違った順序であり、で終了します。
  3. SELECT 'B'は、後で参照する任意の名前のBの値を与えません。

    DECLARE @a AS VARCHAR(10) 
    DECLARE @b AS VARCHAR(10) 
    
    SET @a = 'A' 
    SET @B = 'B' 
    
    SELECT @a + @b 
    ; 
    

    別のアプローチ:

    select a + b 
    from (select 'A' as a, 'B' as b) as derived 
    
    ここ

    派生テーブルの列とBのエイリアスが与えられ

T-SQLは、以下の許可しこれは外側のselect節で参照して連結を実行することができます。

関連する問題