1

だから私はすべてのテーブルに対してこれを行う方法を知っています:

DECLARE @month VARCHAR(9)
DECLARE @db VARCHAR(10)
DECLARE @sql NVARCHAR(max)

SET @month = (SELECT Datename(month, Getdate()))
SET @db = 'MyDatabase'
SET @sql = 'SELECT * INTO ' + @db + '.dbo.MyTable_' + @month
           + ' FROM ' + @db + '.dbo.MyTable'

PRINT @sql

EXEC Sp_executesql @sql  

しかし、いくつかの大きなSPを@sql変数に収めることはできません。明らかにできたとしても、次のようになります。

CREATE / ALTER PROCEDURE'では、データベース名をオブジェクト名のプレフィックスとして指定することはできません。

テキスト全体なしでSP転送をスクリプト化する方法はありますか?

もしそうなら、どのように私はのための変数でデータベース名を取得できますかUSE [dbname]

私はsqlmcdモードで私が次のようなことをすることができることを知っています

:setvar dbname "MyDatabase" 
USE $(dbname)

しかし、私はまた、次のような変数としてdbnameを持っている必要があります

DECLARE @db VARCHAR(10)
SET @db = (SELECT Datename(year, Getdate()))
:setvar dbname @db
USE $(dbname)

したがって、目標は、スクリプトを手動で変更することなく、毎月多数のSPをデータベースにアーカイブし、毎年新しいデータベースを作成することです。

4

2 に答える 2

1

私は手足に出かけて、あなたが毎月あなたのストアドプロシージャのソースコードをアーカイブしようとしていると仮定します:

DECLARE @month VARCHAR(9)
DECLARE @db VARCHAR(128)
DECLARE @sql NVARCHAR(max)

SET @month = (SELECT Datename(month, Getdate()))
SET @db = 'AdventureWorks'
SET @sql = 'SELECT m.* INTO ' + @db + '.dbo.SPs_' + @month
           + ' FROM ' + @db + '.sys.procedures p '
           + 'INNER JOIN ' + @db + '.sys.sql_modules m ' 
           + 'ON p.object_id = m.object_id'

PRINT @sql

EXEC Sp_executesql @sql  

表のdefinition列には、ストアード・プロシージャー・コードが含まれます。

于 2012-06-22T00:51:40.900 に答える
0

あなたはいくつかの余分な仕事をする必要があります。データベースにストアドプロシージャを作成するには、次のものが必要です。

<database>..sp_executesql(<create table statement>)

あなたがデータベースを知っているなら、素晴らしいです!そうでない場合は、動的SQL内で動的SQLを実行する必要があります。最終的には次のようになります。

declare @sql nvarchar(max);
set @sql = @databasename+N'..sp_executesql '''+replace(@createsql, '''', '''''')+'''
exec(@sql);

私はそれらの引用を正しく理解したと思います。

于 2012-06-21T21:09:07.833 に答える