是否可以将数据库名称作为参数传递

Is it possible to pass db name as a parameter

提问人:Cato Johnston 提问时间:3/9/2009 最后编辑:Jonathan LefflerCato Johnston 更新时间:9/4/2014 访问量:6903

问:

我在 cms 中构建了大约 100 个站点,每个站点都有自己的数据库。每个数据库都有相同的表。

我的存储过程需要选择给定站点名称的数据库中的所有页面。

下面我试图将数据库名称作为参数传递,但它似乎不起作用。

...
@site nvarchar(250)

AS

SELECT *
FROM @site..cmsDocument
WHERE published = 1

有没有其他方法可以做到这一点?

sql-server 存储过程

评论


答:

1赞 Ignacio Vazquez-Abrams 3/9/2009 #1

几乎没有 DBMS 允许您以这种方式使用参数。通过串联构建动态查询并执行它。

3赞 Mitch Wheat 3/9/2009 #2
SELECT @dbname = quotename(dbname)
SELECT @sql = ' SELECT ... FROM ' + @dbname + '.dbo.tablename WHERE ...'
EXEC sp_executesql @sql, @params, ...

裁判:

sp_executesql (Transact-SQL)

动态 SQL 的诅咒与祝福

评论

0赞 Jonathan Leffler 3/9/2009
使用具有分布式查询表示法的动态 SQL 是唯一可行的方法。
2赞 Guffa 3/9/2009 #3

可以在连接字符串中指定数据库:

数据源=myServerAddress;初始目录=myDataBase;用户 Id=myUsername;密码=myPassword;

0赞 Diego 3/9/2009 #4

可以使用未记录的存储过程sp_MSforeachdb: sp_MSforeachdb '从?..中选择 *table_name_here'

0赞 Travis Miller 9/4/2014 #5

如果查询/过程是从 .NET 应用程序执行的,您还可以以编程方式更改连接对象的数据库 (VB.NET):

Using da As New SqlDataAdapter("SELECT * FROM cmsDocument WHERE published = 1", GetDatabaseConnection(ServerName))
     da.SelectCommand.Connection.ChangeDatabase("Foobar")
End Using