web-dev-qa-db-ja.com

T-SQLのPRINTステートメント

T-SQLのPRINTステートメントが時々しか機能しないように見えるのはなぜですか?それを使用する際の制約は何ですか?結果セットが生成され、ヌル関数になる場合がありますが、結果セットの破損を防ぐと仮定しましたが、行カウントなどの別の結果セットで出力が出ないことはありますか?

67
ProfK

したがって、次のようなステートメントがある場合、「印刷」結果が得られないと言っているのですか?

select * from sysobjects 
 PRINT 'Just selected * from sysobjects'

SQLクエリアナライザーを使用している場合は、下部に2つのタブがあり、そのうちの1つは「メッセージ」で、「印刷」ステートメントが表示される場所です。
あなたが心配なら タイミング 印刷文を見るには、次のようなものを使用してみてください。

raiserror( 'My Print Statement'、10,1)with nowait

これにより、クエリアナライザがほとんどの条件下で行うように、出力をバッファリングするのではなく、ステートメントに到達するとすぐにメッセージが表示されます。

95

TSQLのPrintステートメントは、おそらくその名前のために、誤解されたクリーチャーです。それは実際にエラー/メッセージ処理メカニズムにメッセージを送信し、次にそれを呼び出し側アプリケーションに転送します。 PRINTはかなり馬鹿げています。 8000文字(4000 Unicode文字)しか送信できません。リテラル文字列、文字列変数(varcharまたはchar)、または文字列式を送信できます。 RAISERRORを使用する場合、2,044文字の文字列に制限されます。ただし、標準Cライブラリの古いprintfに似た書式設定関数を呼び出すため、呼び出し元のアプリケーションに情報を送信するために使用する方がはるかに簡単です。 RAISERRORは、テキストメッセージに加えてエラー番号、重大度、および状態コードを指定することもできます。また、sp_addmessageシステムストアドプロシージャを使用して作成されたユーザー定義メッセージを返すためにも使用できます。メッセージを強制的に記録することもできます。

エラー処理ルーチンは、メッセージとエラーが非常に似ているにもかかわらず、メッセージの受信には適していません。もちろん、この手法は、データベースへの実際の接続方法(OLBC、OLEDBなど)によって異なります。 System.Data.SQLClientを使用している場合、SQL Serverデータベースエンジンからメッセージを受信して​​処理するには、イベントを処理するメソッドを識別するSqlInfoMessageEventHandlerデリゲートを作成して、InfoMessageイベントをリッスンする必要があります。 SqlConnectionクラス。システムの観点からは、これらのメッセージはエラーのように見えるため、重大度や状態などのメッセージコンテキスト情報が引数としてコールバックに渡されることがわかります。

ファイルにスプールしているだけでも、アプリケーションでこれらのメッセージを取得する方法を用意することをお勧めします。本当にあいまいな問題を追いかけようとしているときには、常にメッセージが使用されるからです。ただし、アプリケーションの内容を表示する情報レベルを予約できない限り、エンドユーザーにエンドユーザーに見せてほしいとは思いません。

37
Phil_Factor

クエリアナライザーはメッセージをバッファリングします。 PRINTおよびRAISERRORステートメントは両方ともこのバッファーを使用しますが、RAISERRORステートメントにはWITH NOWAITオプションがあります。メッセージをすぐに印刷するには、次を使用します。

RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERRORは、メッセージの400文字のみを表示し、テキストのフォーマットにCのprintf関数に似た構文を使用します。

WITH NOWAITオプションを指定してRAISERRORを使用すると、メッセージバッファーがフラッシュされるため、以前にバッファーされたすべての情報も出力されることに注意してください。

25
JimCarden

私は最近これに遭遇しましたが、それはヌル変数に変換ステートメントがあったために終わりました。それがエラーを引き起こしていたため、印刷ステートメント全体がヌルとしてレンダリングされ、まったく印刷されませんでした。

例-これは失敗します:

declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

例-これは印刷されます:

declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')
21
WEFX

出力から実際に印刷ステートメントが欠落しているこの質問を読んでいる他の人の利益のために、実際には印刷は実行されるがクライアントに返されない場合があります。それらが何であるかを具体的に言うことはできません。 printステートメントの直前と直後にgoステートメントを配置すると、実行された場合にそれが表示されます。

3
JohnOpincar

出力されたこれらの印刷ステートメントに関連付けられている変数はありますか?もしそうなら、変数に値がない場合、printステートメントは出力されないことがわかりました。

0
user2574678