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 回答