我需要在各种SQL Server实例上执行某些脚本。他们使用具有不同标识的数据库。但是,所有数据库都具有应处理的相同表(相同名称和结构)。因此,我想检测数据库的名称,将其设置为字符串变量,构造SQL语句,并通过sp_executesql
执行构造的字符串。正确执行的裸命令是:
USE [1000574];
SELECT TOP 10 temperature_1, UTC FROM dbo.Data;
然后我尝试使用@database_name
占位符执行等效字符串:
DECLARE @database_name nvarchar(100);
SET @database_name = '1000574';
EXEC sp_executesql N'USE [@database_name];
SELECT TOP 10 temperature_1, UTC FROM dbo.Data;',
N'@database_name nvarchar(100)',
@database_name = @database_name
我得到的是以下错误消息:
* Msg 911,Level 16,State 1,Line 1
数据库'@database_name'不存在。确保正确输入名称。*
错误在哪里?
谢谢,彼得
答案 0 :(得分:3)
您无法将参数参数化为use
:它需要一个文字。而是动态构造查询:
declare @sql nvarchar(max)
set @sql = 'USE [' + @database_name + '];' +
'SELECT TOP 10 temperature_1, UTC FROM dbo.Data;';
exec (@sql)
答案 1 :(得分:2)
另一种方法:
DECLARE @database_name NVARCHAR(100),@sp_executesql NVARCHAR(100),@sql_cmd NVARCHAR(512);
SET @database_name = N'1000574';
SET @sp_executesql = @database_name + N'.dbo.sp_executesql';
SET @sql_cmd = N'SELECT TOP 10 temperature_1, UTC FROM dbo.Data;';
EXEC @sp_executesql @sql_cmd;
答案 2 :(得分:2)
为什么不:
DECLARE @sql NVARCHAR(MAX), @database_name SYSNAME;
SET @database_name = N'1000574';
SET @sql = N'SELECT TOP 10 temperature_1, UTC FROM '
+ QUOTENAME(@database_name) + '.dbo.Data;';
EXEC sp_executesql @sql;
为什么没有命令通过TOP
告诉SQL Server你的意思?
答案 3 :(得分:1)