SQL Server 动态获取数据库名称

dvtswwa3  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(190)

我尝试动态获取数据库名称,但是显示了一些错误。
我尝试过的:

Declare @dbname varchar(40) = (select name from sys.databases where name like '%worksdw2019')

select db_name() as [Database], *  
from @dbname.dbo.DimCustomer with (readuncommitted)

最终结果应该是什么样子

select db_name() as [Database], * 
from AdventureWorksdw2019.dbo.dimcustomer

以下是我遇到的错误:
消息102,级别15,状态1,行3
.""附近的语法不正确。
消息319,级别15,状态1,行3
关键字"with"附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一语句必须以分号结尾。

a11xaf1n

a11xaf1n1#

您不能参数化数据库名称,因此需要动态SQL。

DECLARE @context nvarchar(1000);

SELECT @context = QUOTENAME(name) + N'.sys.sp_executesql'
  from sys.databases 
  where name like N'%worksdw2019';
  -- what if there is more than one?

DECLARE @sql nvarchar(max) = N'select db_name() as [Database], *
  from dbo.DimCustomer;';

EXECUTE @context @sql;

呃,为什么?

92dk7w1h

92dk7w1h2#

您写入了无效的SQL。
在SQL Server中,您不能使用这样的变量。如果数据库名称将是变量,如示例中所示,则需要使用EXEC命令执行动态SQL,如下例所示:

Declare @dbname varchar(40) = (select name from sys.databases where name like '%HelloWorld')

EXEC('select db_name() as [Database], *  from ' + @dbname + '.dbo.DimCustomer with (readuncommitted);')

-- you may additionally need to escape your database name
-- if you are using special characters in your name

相关问题