0

動的SQLを使用する厄介なストアドプロシージャがあります。

を呼び出す直前に、動的SQLを含む文字列がprint @sql;どこにあるかを追加することで、実行時にデバッグできます。@sql;execute (@sql);

現在、複数ページのストアドプロシージャも動的テーブルを作成し、クエリで使用します。クエリを実行する直前にこれらのテーブルをコンソールに出力しexecuteて、クエリが何をしようとしているのかを正確に把握したいと思います。

ただし、SQLServer08はそれを好みません。私が試してみると:

print #temp_table;SPをコンパイルしようとすると、次のエラーが発生します。


このコンテキストでは、「#temp_table」という名前は許可されていません。有効な式は、定数、定数式、および(一部のコンテキストでは)変数です。列名は許可されていません。


助けてください。

編集:

SQLに関しては、私は初心者です。ただし、次のステートメントは次のとおりselect * from #tbl;です。非対話的に実行されている場合、コンソールには何も出力されません。ただし、printステートメントは機能します。

次のステートメントの構文が正しくありませんprint select * from #tbl;。stdoutがオプションでない場合、selectの出力をファイルにリダイレクトする方法はありますか?

ありがとう。

4

4 に答える 4

1

この方法でデバッグすると、出力を取得する唯一の方法が

select * from #temp_table;

または、SQL ServerManagementStudioに組み込まれているデバッグ機能を調べます。たとえば、このWebページはあなたを助けるかもしれません

SQLServerのパフォーマンス。com

于 2010-03-18T14:55:13.920 に答える
1

動的 SQl を使用するときは、sp にデバッグ入力変数を設定することから始めます (これを最後のものにして、デフォルト値 0 を指定します (デバッグ モードではないことを示すため、proc を呼び出す既存のコードが壊れません)。 .

デバッグモードで実行すると、実行の代わりに印刷するか、印刷して実行しますが、最後に常にロールバックします。さまざまな段階でデータを確認する必要がある場合、最善の方法は 2 番目の段階です。次に、ロールバックする前に、見たいデータを変数テーブルに入れます(これは重要であり、一時テーブルにすることはできません)。ロールバック後、(ロールバックで範囲外にならなかった) テーブル変数から選択し、print tstatments を実行して、実行されたクエリを確認します。

于 2010-03-18T19:02:56.563 に答える
1

変数は印刷できますが、テーブルは印刷できません。ただし、#table から SELECT することはできます。

ここで、実行される単一のステートメントでテーブルが作成、入力、および変更された場合、変更のテーブルの状態を表示できますが、データは変更されています。

もちろん、動的 sql が終了するとすぐに #table が使用できなくなるため、行き詰まります。

これに対抗するには、動的 SQL の ##Table (二重ハッシュ マークに注意) に #table と共に挿入し、動的 ​​SQL の実行の最後にその ##table をクエリします。

于 2010-03-18T14:59:57.607 に答える
1

私はカーソルが嫌いなので、これを試してみてください:

SET NOCOUNT ON
CREATE TABLE #TempTable1
(ColumnInt      int        
,ColumnVarchar  varchar(50)
,ColumnDatetime datetime   
)
INSERT INTO #TempTable1 VALUES (1,'A',GETDATE())
INSERT INTO #TempTable1 VALUES (12345,'abcdefghijklmnop','1/1/2010')
INSERT INTO #TempTable1 VALUES (null,null,null)
INSERT INTO #TempTable1 VALUES (445454,null,getdate())
SET NOCOUNT OFF

DECLARE @F_ColumnInt      int
       ,@F_ColumnVarchar  varchar(50)
       ,@F_ColumnDatetime datetime

DECLARE CursorTempTable1 CURSOR FOR
    SELECT
        ColumnInt, ColumnVarchar, ColumnDatetime
    FROM #TempTable1
    ORDER BY ColumnInt
    FOR READ ONLY

--populate and allocate resources to the cursor
OPEN CursorTempTable1

PRINT '#TempTable1 contents:'
PRINT '    '+REPLICATE('-',20)
       +'  '+REPLICATE('-',50)
       +'  '+REPLICATE('-',23)

--process each row
WHILE 1=1
BEGIN

    FETCH NEXT FROM CursorTempTable1
        INTO @F_ColumnInt, @F_ColumnVarchar, @F_ColumnDatetime

    --finished fetching all rows?
    IF @@FETCH_STATUS <> 0
    BEGIN --YES, all done fetching
        --exith the loop
        BREAK
    END --IF finished fetching

    PRINT '    '+RIGHT(   REPLICATE(' ',20)   +   COALESCE(CONVERT(varchar(20),@F_ColumnInt),'null')                               ,20)
           +'  '+LEFT(                            COALESCE(@F_ColumnVarchar,'null')                        +   REPLICATE(' ',50)   ,50)
           +'  '+LEFT(                            COALESCE(CONVERT(char(23),@F_ColumnDatetime,121),'null') +   REPLICATE(' ',23)   ,23)

END --WHILE

--close and free the cursor's resources
CLOSE CursorTempTable1
DEALLOCATE CursorTempTable1

出力:

#TempTable1 contents:
--------------------  --------------------------------------------------  -----------------------
                null  null                                                null                   
                   1  A                                                   2010-03-18 13:28:24.260
               12345  abcdefghijklmnop                                    2010-01-01 00:00:00.000
              445454  null                                                2010-03-18 13:28:24.260

一時テーブルに PK があることがわかっている場合は、カーソルのないループの例を示します。

于 2010-03-18T17:34:49.307 に答える