我想使用一个名称存储在变量中的数据库。我该怎么做呢? 我首先想到这会起作用,但事实并非如此:
exec('use '+@db)
这不会改变数据库上下文
建议任何人?
答案 0 :(得分:1)
不幸的是,我不知道这个问题的直接解决方案。最近的工作版本是:
DECLARE @db nvarchar(MAX)
SET @db = 'use DBname'
Exec sp_executesql @db
但这只会更改过程调用长度的上下文。但是,可以在该调用中包含更多语句以使用上下文:
DECLARE @sql nvarchar(MAX)
SET @sql = 'use DBName SELECT * FROM Table1'
Exec sp_executesql @sql
答案 1 :(得分:1)
如果你绝对必须使用动态SQl这样做,我更喜欢这个:
DECLARE @sql nvarchar(MAX)
declare @databasename varchar (20)
Set @databasename = mydatabase
SET @sql = 'SELECT * FROM ' + @databasename + 'dbo.Table1'
Exec sp_executesql @sql
我更喜欢它的原因是你可以扩展它以在需要时在同一个查询中使用多重数据库。
我担心您不知道每个表的数据库名称,而不采用动态方法。换句话说,为什么你不能写:
SELECT * FROM mydatabase.dbo.Table1
如果您有多个具有相同表名的数据库,则可能存在设计问题。
答案 2 :(得分:0)
use
语句仅在exec
块内的范围内。因此,您必须在同一exec
:
exec('use '+ @db + '
--do other stuff'
)
答案 3 :(得分:0)
据推测,您知道所有可能的数据库名称。这样做的一种(略微无助)方法是使用CASE或多个IF语句来测试变量并对每个案例硬编码USE语句。