【问题标题】:How to create a Script that Archives SPs with variables in table name and DB name?如何创建使用表名和数据库名中的变量归档 SP 的脚本?
【发布时间】:2012-06-24 04:27:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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 列将包含存储过程代码。

    【讨论】:

    • 是的,您的假设是正确的。但是,我的目标是将它们分别归档为另一个数据库中的实际存储过程,并将年份作为 dbname 的一部分。定义栏是不是8000个字符后不删码?这些是相当大的 SP。
    • 不知道为什么我认为 8000 是最大长度显然超过十亿。只要我能找到一种将其格式化回查询窗口的方法,这应该可以工作。由于这一切都在一条线上,因此我使用的 SQL 格式化程序由于 cmets 而出现问题。
    【解决方案2】:

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

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

    如果您了解数据库,那就太好了!如果没有,你必须在动态sql中做动态sql。结果是这样的:

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

    我认为我的引用是正确的。

    【讨论】:

    • 您的答案是关于如何移动表或存储过程吗?我只是在询问 SP。
    • 存储过程。在 SQL Server 中,如果不使用动态 sql,则无法在另一个数据库中创建存储过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2020-01-19
    • 2011-08-11
    相关资源
    最近更新 更多