如何创建一个脚本,用表名和数据库名称中的变量存档SP?

时间:2012-06-21 20:55:40

标签: sql sql-server-2008 tsql stored-procedures dynamic

所以我知道如何为我的所有表格执行此操作:

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存档到数据库中,每年都有新的数据库,而无需手动更改脚本。

2 个答案:

答案 0 :(得分: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列将包含存储过程代码。

答案 1 :(得分:0)

你需要做一些额外的工作。要在数据库中创建存储过程,您需要:

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

如果您了解数据库,那太好了!如果没有,你必须在动态sql中做动态sql。它最终会像:

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

我想我的报价是正确的。