【问题标题】:EXEC to USE Database执行到使用数据库
【发布时间】:2014-09-02 14:18:49
【问题描述】:

我编写了一个脚本,它生成一个数据库备份文件名,备份数据库,然后用新的数据库名将其还原为副本。该名称基于一些日期/时间数据。

然后我需要在脚本中USE 那个数据库,然后禁用所有触发器。

但是,这不起作用:

DECLARE @Use VARCHAR(50)
SET @Use = 'USE ' + @NewDatabaseName

EXEC(@Use)

手动运行 - 数据库没有被“使用”。

如何使用变量执行USE 语句?

我也尝试过sp_executesql proc,结果相同。数据库没有改变。

DECLARE @sqlCommand nvarchar(1000)
SET @sqlCommand = 'USE ' + @NewDatabaseName

EXECUTE sp_executesql @sqlCommand

看来我可能需要进入 sqlcmd 模式?不过,真的希望不要。

【问题讨论】:

  • 你需要使用 sp_executesql
  • 我在看那个,但它似乎需要一些参数,我正在努力理解在“USE”语句的情况下它们会是什么。
  • 只是想知道:您的 based on some date/time data 数据库名称是否超过 46 个字符?
  • 不,数据库名称是 8 个字符长。
  • USE <dbname>之后使用GO?

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

execexecute_sql 都在各自的范围内运行。而数据库的变化只会影响自己的范围。所以你可以:

set @sql = 'use ' + quotename(@new_db_name) + '; disable trigger t1;'
exec (@sql)

据我所知,没有办法将当前作用域的数据库上下文更改为可变数据库名称。

【讨论】:

  • 是的,在一个 EXEC 中完成所有操作。在看到您的初始答案后就这样做了。谢谢。现在学到了一些东西。
猜你喜欢
  • 2018-06-20
  • 2018-10-28
  • 2016-05-06
  • 1970-01-01
  • 2020-05-06
  • 2016-02-25
  • 2022-11-14
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多