sql >> データベース >  >> RDS >> Sqlserver

SQLServerのPRINTステートメントの概要

    SQL PRINTステートメントは、ユーザー定義メッセージを表示するのに役立ちます。たとえば、T-SQLループを使用してスクリプトを開発していて、ループの各反復で特定のメッセージを表示したいとします。次に、PRINTステートメントを使用できます。または、条件付きステートメントを使用してスクリプトを開発するときに使用できます。その場合、ステートメントによって評価された条件が正しいステップを実行するか、正しい出力を生成することを確認します。 PRINTステートメントを使用して、T-SQLクエリまたはストアドプロシージャのプロセスを追跡したり、カスタマイズされたメッセージを返したりすることもできます。

    現在の記事では、次のユースケースに焦点を当てています。

    1. PRINTステートメントを使用して文字列またはint値を出力します。
    2. IF…ELSEステートメントでのPRINTの使用。
    3. WHILEループでのPRINTの使用。

    PRINTステートメントの構文は次のとおりです。

    Print string | @variable | str_expression
    • 文字列 :値は文字またはUnicode文字列にすることができます。
    • @variable :文字データ型は、文字またはUnicode文字データ型である必要があります。
    • str_expression :値は文字列を返す式にすることができます。リテラル値、文字列関数、変数にすることができます。

    PRINTステートメントを使用して特定の値を表示すると、出力はSQL ServerManagementStudioのメッセージペインに返されます。

    注: PRINTステートメントは、8000文字の長さの文字列または4000文字の長さのUnicode文字列を表示できます長さが8000を超えると、残りの文字列は切り捨てられます。

    PRINTステートメントの制限

    1. PRINT関数は、文字列またはUNICODE文字列を返します。したがって、文字列と整数のデータ型を連結するときに、INT値をcharまたはvarcharデータ型に明示的に変換する必要があります。
    2. SQLServerプロファイラーはPRINTステートメントをキャプチャしません。

    例:文字列値を出力する

    Hello、Worldを出力するステートメントを作成するとします。 画面に。 T-SQLは次のようになります。

    Print 'Hello World'

    出力:

    @stringに保存されている値を出力するには 変数の場合、次のコードが必要です:

    declare @String varchar(30)
    set @String='Hello World'
    Print @String
    

    出力:

    PRINTステートメントを使用して整数値を出力します

    次のT-SQLスクリプトを使用します。

    Print 10

    出力:

    @intvalueの値を出力するには パラメータには、次のT-SQLスクリプトを使用します。 @intvalueのデータ型 は整数です。

    declare @IntValue Int
    set @IntValue = 10
    Print @IntValue
    

    出力:

    PRINTステートメントを使用して、基本的な算術関数を実行できます。 2つの値のSUMを実行するとします。これを行うには、2つの数値の間にプラス(+)記号を追加します。

    Print 10+10

    出力:

    PRINTステートメントを使用してカスタムメッセージを印刷する

    PRINTステートメントを使用して現在の時刻を印刷するとします。そのために、 @inputstringという名前の2つのSQLPRINT変数を宣言しています。 および@currentdate @inputstringのデータ型 varchar(50)、 および@currentdate datetime 。クエリは次のとおりです。

    declare @inputstring varchar(500)
    declare @currentdate datetime
    set @inputstring ='The time is '
    set @currentdate= (select getdate())
    Print @inputstring + @currentdate
    

    出力:

    エラーが発生します。このエラーを修正するには、 @currentdateに格納されている値を明示的に変換する必要があります 変数。 T-SQLスクリプトは次のようになります。

    declare @inputstring varchar(500)
    declare @currentdate datetime
    set @inputstring ='The time is '
    set @currentdate= (select getdate())
    Print @inputstring + convert(varchar,@currentdate,103)
    

    出力:

    IF…ELSEステートメントでのPRINTステートメントの使用

    それでは、 Hello Worldを印刷してみましょう。 IF…ELSEループで指定された条件に基づきます。条件がTRUEと評価された場合は、 Hello Worldを出力します。 。 FALSEと評価された場合は、 Hello Indiaを印刷します。 。

    if (0=0)
    print 'Hello World'
    else 
    Print 'Hello India'
    

    出力:

    同様に、T-SQL変数に格納されている値を使用して、出力を比較および出力できます。

    データベースのステータスをチェックするストアドプロシージャを作成しました。オンラインの場合は、オンラインで印刷されます。それ以外の場合は、ERRORを出力します。 database_idを渡します 入力パラメータとして。

    ストアドプロシージャのT-SQLコードは次のとおりです。

    create procedure getDBStatus
    @DatabaseID int 
    as
    begin
    declare @DBStatus varchar(20)
    set @DBStatus=(select state_desc from sys.databases where [email protected])
    if @DBStatus='ONLINE'
    Print ' Database is ONLINE'
    else
    Print 'Database is in ERROR state.'
    End
    

    ストアドプロシージャを実行します:

    Exec getDBStatus 5

    出力:

    それでは、ELSE条件をテストしてみましょう。 @の別の値を使用してストアドプロシージャを実行します databaseID パラメータ:

    use master
    go
    exec getDBStatus 6
    

    出力:

    WHILEループでのPRINTステートメントの使用

    HelloWorldを10回印刷するとします。次に、WHILEループを使用できます。以下は、helloworldを複数回印刷するためのT-SQLコードです。

    Declare @i int =0
    declare @iterations int =10
    While (@i<@iterations)
    Begin
    Print 'Hello World'
    set @[email protected]+1
    End
    

    出力:

    次に、すべてのユーザーデータベースのバックアップを生成するT-SQLクエリのスクリプトを開発しましょう。スクリプトの進行状況を表示するには、PRINTステートメントを使用しています。

    スクリプトでは、SQLで次の変数を使用します。

    1. @DBcount ユーザーデータベースの数を保持します。データ型は整数です。
    2. @i 増分値を保持します。データ型は整数です。
    3. @DBName データベース名の値を保持します。データ型はvarchar(200)です。
    4. @SQLCommand バックアップデータベースを保持します 指図。データ型はnvarchar(max)です。
    5. #Databases 一時テーブルです。ユーザーデータベースの名前を挿入しています。

    まず、スクリプトは#データベースという名前の一時テーブルを作成します ユーザーデータベース名を挿入します。

    create table #Databases (name varchar(200))
    insert into #Databases select name from sys.databases where database_id>4
    

    次に、ユーザーデータベースのカウントを入力し、その値を @DBCountに保存します。 パラメータ:

    set @DBCount=(select count(1) from #Databases)

    次に、WHILEループがデータベースの名前を設定します。 WHILEループは、 @iの値まで実行されます。 および@DBCount 同等になります。

    WHILE (@DBCount>@i)

    WHILEループでは、TOP句を使用して、 #Databasesからデータベースの名前を取得します。 テーブルを作成し、 @DBNameに保存します 変数。

    Begin
    set @DBName=(select top 1 name from #Databases)
    

    その後、動的なT-SQLコマンドが作成されます。 @DBNameの値を設定します 動的SQLのパラメータ。

    set @SQLCommand = 'Backup database [' [email protected]+'] to disk =''D:\Backup\' + @DBName +'.bak'''

    バックアップデータベースのクエリが正しいことを確認するために、 @SQLCommandを返すPRINTステートメントを追加しました。 可変値。

    Print @SQLCommand

    次のステートメントは、 @Iの値をインクリメントします @DBName に保存されている名前のレコードを1つずつ削除します 変数。

    delete from #Databases where [email protected]
    set @[email protected] + 1
    End
    

    完全なスクリプトは次のとおりです。

    set nocount on
    declare @DBCount int
    declare @i int =0
    declare @DBName varchar(200)
    declare @SQLCommand nvarchar(max)
    create table #Databases (name varchar(200))
    insert into #Databases select name from sys.databases where database_id>4 
    set @DBCount=(select count(1) from #Databases)
    WHILE (@DBCount>@i)
    Begin
    set @DBName=(select top 1 name from #Databases)
    set @SQLCommand = 'Backup database [' [email protected]+'] to disk =''D:\Backup\' + @DBName +'.bak'''
    Print @SQLCommand
    delete from #Databases where [email protected]
    set @[email protected] + 1
    End
    drop table #Databases
    

    スクリプトの出力は次のとおりです。

    上記のスクリプトを使用して、すべてのユーザーデータベースをバックアップするための特定のスクリプトを準備できます。

    概要

    この記事では、SQL ServerでのPRINTステートメントの本質と制限について説明し、実際の例でその使用法を示しました。


    1. データベーススキーマをどのようにバージョン管理しますか?

    2. エンティティ-属性-値テーブルの設計

    3. Oracle11g-RegExで制約をチェック

    4. Pythonを使用してOracleデータベースにバッチ挿入するにはどうすればよいですか?