我的数据库中有一个表,其中包含所有服务器数据库的名称
表格如
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上的其他人发布的,但答案不明确&我有同样的怀疑。所以请帮忙
答案 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