所以我知道如何为我的所有表格执行此操作:
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存档到数据库中,每年都有新的数据库,而无需手动更改脚本。
答案 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);
我想我的报价是正确的。