【问题标题】:In SQL server is there any way to get the 'use database' command to accept a variable在 SQL Server 中,有什么方法可以让“使用数据库”命令接受变量
【发布时间】:2009-06-10 01:43:28
【问题描述】:

我想编写一个“通用”脚本来操作多个数据库。 'use databasename' 命令将分布在脚本的主体中。我宁愿在脚本顶部显示数据库名称信息。所以理想情况下:

声明@db varchar(100) 设置@db = 'data_in' 使用@db

这失败了。所以也许

声明@db varchar(100) 设置@db = 'data_in' exec ('使用'+@db)

这会执行,但可能只在字符串中的查询上下文中更改数据库。
那么有没有其他方法可以不将整个脚本放入一个字符串并以这种方式执行它。比疾病更糟糕的治疗方法?

【问题讨论】:

    标签: sql-server sql-server-2005 scripting


    【解决方案1】:

    查看SQLCMD 中的脚本变量。

    这使您能够以以下形式将变量放入脚本中:

    USE $(db1_name)
    ...some code...
    
    USE $(db2_name)
    ...some code...
    

    并从环境变量、运行时提供的参数或硬编码的值分配中插入变量值。

    【讨论】:

    • 设置脚本变量说:setvar db1_name dbaaa 然后你可以说USE $(db1_name)
    【解决方案2】:

    Ed 已经提到过 SQLCMD,一个非常好的脚本选择。

    如果这不适合您,并且您在服务器上拥有 sa 权限,并且您不介意使用未记录的功能和修改主数据库的风险,您可以查看用户定义的系统存储过程.

    在 master 数据库中创建用户定义的系统存储过程 (UDSSP),前缀为“sp_”,并使用未记录的系统过程 sp_MS_marksystemobject (SQL2005) 标记为系统对象。

    它从当前连接中获取它的数据库上下文,或者如果调用的话,它是一个由三部分组成的名称。

    示例调用:

    declare @db sysname
    declare @sql nvarchar(max)
    set @db = 'yourdatabase'
    set @sql = 'exec '+quotename(@db)+'..sp_@yourproc'
    exec (@sql)
    

    注意事项:

      1234563特别的。
    1. 一旦程序被标记为系统,就无法更新。要进行更改,您必须作为系统删除、重新创建和备注。

    2. 除非您知道自己在做什么并进行了更多研究,否则不要这样做。如果您厌恶风险,请不要这样做。如果您没有首先要测试的开发实例,请不要这样做。

    3. 将 UDSSP 备份到文件或 CSV。服务器升级可以消灭它们。

    【讨论】:

      【解决方案3】:

      您可以在您的脚本中添加一条 use 语句,并为数据库提供 osql 命令(或您正在使用的任何命令),如下所示:

      osql -S servername -d databasename -U username -P password -i script.sql
      

      【讨论】:

      • 但是涉及的数据库不止一个。因此需要在脚本的各个点切换数据库上下文。
      • 拆分脚本并分别执行?
      【解决方案4】:

      我认为你的推定是正确的;我昨天有同样的问题。我通过将命令放入单个字符串来解决它。你为什么不喜欢那个解决方案?

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 2021-04-08
        • 2016-10-28
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多