【问题标题】:Is it possible to pass db name as a parameter是否可以将数据库名称作为参数传递
【发布时间】:2009-03-09 02:17:37
【问题描述】:

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

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

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

...
@site nvarchar(250)

AS

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

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

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:
    SELECT @dbname = quotename(dbname)
    SELECT @sql = ' SELECT ... FROM ' + @dbname + '.dbo.tablename WHERE ...'
    EXEC sp_executesql @sql, @params, ...
    

    参考:

    sp_executesql (Transact-SQL)

    The Curse and Blessings of Dynamic SQL

    【讨论】:

    • 将动态 SQL 与分布式查询表示法结合使用是唯一可行的方法。
    【解决方案2】:

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

    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您可以使用未记录的存储过程 sp_MSforeachdb: sp_MSforeachdb 'SELECT * FROM ?..table_name_here'

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2018-10-11
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            • 2017-03-24
            • 1970-01-01
            • 1970-01-01
            • 2012-02-23
            • 1970-01-01
            相关资源
            最近更新 更多