4

SQLストアドプロシージャを.sqlファイルに抽出することに関する私の最後の質問を参照してください(ここを参照)別の質問があります:

結果セット間のsqlcmd空白行を回避または削除する方法は?

理由(MSDNを参照) 複数の結果が返される場合、sqlcmdはバッチ内の各結果セットの間に空白行を出力します。

これは、ストアドプロシージャ(4000文字を超える)がsyscommentsでそれぞれ2つの部分に分割され、sqlcmdを使用してテキスト(.sql)ファイルにエクスポートされる場合、この分割点に新しい行があることを意味します。それを削除または回避する方法は?

前もって感謝します!

ショーン

4

1 に答える 1

2

バッチファイルの更新は次のとおりです(8000文字を超える制限で機能しますが、この制限を調整するのは簡単です):

for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "DECLARE @I INT, @SP1 NVARCHAR(4000), @SP2 NVARCHAR(4000) SET @I = 0 SET @SP1 = '' SET @SP2 = '' SELECT @I = @I + 1, @SP1 = CASE WHEN @I = 1 THEN text ELSE @SP1 END, @SP2 = CASE WHEN @I = 2 THEN text ELSE @SP2 END from dbo.syscomments WHERE id = OBJECT_ID('%%a') SELECT @SP1+@SP2" -o "%%a.sql"

個人的に私は非常に大規模な手順を懸念しています。

これは制限ですが、行番号が 4000 文字を超えるストアド プロシージャがある場合、このブログを読んで解決できるよりもはるかに大きな問題が発生する可能性があります。したがって、ほとんどの人にとっては大したことではないでしょう。私が言ったように、あなたの行がそんなに長いなら、あなたはより大きな問題を抱えています!
Adam Machanic - TSQL ルーチンの「反映」

しかし、大規模な手順は問題にならないという考えもあります。

「テキスト」フィールドは NVARCHAR(4000) として定義されているため、各行には最大 4000 文字しか保持できません。ただし、オブジェクト コードが 4000 文字をはるかに超えることも珍しくありません。 Solomon Rutzky - テキストのオブジェクトの検索

于 2009-02-25T17:04:31.083 に答える