4

あるデータベースには存在するが別のデータベースには存在しない information_schema.routines を使用して、ストアド プロシージャ定義のリストをクエリしようとしています。

SELECT 
    t1.Routine_Definition
FROM
    [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN
    [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
    t2.Routine_Name is null


これにより、クエリ定義が 1 行で表示されるので、このようなコメントがある場合

--Some comment
SELECT Column
FROM Somewhere

SQL がコメントアウトされ、その定義を使用して SP を作成できません。

これを適切な改行で解析するにはどうすればよいですか?
または
これらのスクリプトを (コードを使用して) 取得するより良い方法はありますか?

4

3 に答える 3

9

ストアドプロシージャは、ManagementStudioでは1行にのみ表示されます。結果をテキストにしたクエリを実行する、以下を使用すると、正しい改行が得られます。

declare @sql varchar(8000) -- varchar(max) in SQL 2005+

SELECT 
        @sql = t1.Routine_Definition
FROM
        INFORMATION_SCHEMA.Routines t1 

print @sql
于 2009-02-04T20:40:41.043 に答える
1
DECLARE MY_CURSOR Cursor
FOR

SELECT 
        t1.Routine_Definition
FROM
        [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN
        [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
        t2.Routine_Name is null AND
        LEN(t1.Routine_Definition) < 4000



Open My_Cursor
DECLARE @sql VARCHAR(MAX) 

FETCH NEXT FROM MY_Cursor INTO @sql
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)

Print @sql

FETCH NEXT FROM MY_CURSOR INTO @sql
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

ckのソリューションを実装した方法は次のとおりです...

INFORMATION_SCHEMA ビューは、定義の最初の 4000 文字のみを返します。(理想的には、それほど長い SP はありません)それらを手動または他の方法でスクリプト化する必要があります。

于 2009-02-04T20:58:36.107 に答える
-1

ストアドプロシージャを取得する最も簡単な方法は、SQL ServerManagementStudioに組み込まれているインポート/エクスポートユーティリティを使用することだと思います。そこから、ストアドプロシージャオブジェクトをコードウィンドウまたはすぐに実行できるファイルにエクスポートできます。

于 2009-02-04T20:33:41.680 に答える