将数据库名称存储在变量&然后动态使用它

时间:2017-04-13 08:24:02

标签: sql sql-server tsql

我的数据库中有一个表,其中包含所有服务器数据库的名称

表格如

   create   Table  #db_name_list(Did INT IDENTITY(1,1), DNAME NVARCHAR(100))
    INSERT INTO #db_name_list
    SELECT 'db_One ' UNION ALL
    SELECT 'db_Two' UNION ALL
    SELECT 'db_Three' UNION ALL
    SELECT 'db_four' UNION ALL
    SELECT 'db_five'

select * from #db_name_list 

我的数据库中有太多的SP ..它使用多个表并加入它们。

目前我正在使用像

这样的SQL代码
Select Column from db_One..Table1
Left outer join db_two..Table2
on ....some Condition ....

需要量 但我不想HARDCODE数据库名称..

我想在Variable中存储DataBase名称并使用它。 原因::我想恢复具有不同名称的相同数据库,并希望运行那些SP ..目前我们不能这样做,因为我使用了db_One..Table1 或者db_two..Table2

我想要一些像......

/ SAMPLE SP /

CREATE PROCEDURE LOAD_DATA
AS
BEGIN

  DECLARE @dbname nvarchar(500)
  set @dbname=(  SELECT DNAME FROM #db_name_list WHERE Did=1)
 set @dbname2=(  SELECT DNAME FROM #db_name_list WHERE Did=2)
  PRINT @DBNAME
  SELECT * FROM   @dbname..table1 
  /* or */
  SELECT * FROM   @dbname2.dbo.table1

END

即使用变量代替数据库名称.. 但它产生了错误

  

"'。'。"

附近的语法不正确

P.S这是由msdn上的其他人发布的,但答案不明确&我有同样的怀疑。所以请帮忙

2 个答案:

答案 0 :(得分:1)

您无法在 static sql查询中使用此类变量。您必须使用 dynamic sql中的变量来构建要执行的查询,例如:

DECLARE @sql nvarchar(500) = 'SELECT * FROM ' + @dbname + '.dbo.mytable'

EXEC(@sql);

答案 1 :(得分:0)

根据您的情况,似乎有几种选择。

<强> 1。简单 - 概括您的程序

只需取出存储过程中的数据库引用,因为如果它存储在数据库中,则不需要显式引用数据库。您的选择查询将如下所示:

SELECT * from schema.table WHERE x = y

而不是

SELECT * from database.schema.table WHERE x = y

然后只需在新数据库中创建存储过程即可。只需连接到新数据库并运行SP即可。此方法还允许您将过程提升为系统存储过程,这意味着它们可以在每个数据库中自动使用,而无需事先运行CREATE。有关详细信息,请参阅this article

<强> 2。中等 - 动态SQL

更改存储过程以将数据库名称作为参数,例如:

CREATE PROCEDURE example (@DatabaseName VARCHAR(200))
AS
BEGIN 
    DECLARE @SQL VARCHAR(MAX) = 'SELECT * FROM ['+@DatabaseName+'].schema.table WHERE x = y'
    EXEC (@SQL)
END