0

我需要在各种 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

我得到的是以下错误消息:

*消息 911,级别 16,状态 1,第 1 行
数据库“@database_name”不存在。确保输入的名称正确。*

错误在哪里?

谢谢,彼得

4

4 回答 4

3

您不能将参数参数化为use: 它需要一个文字。改为动态构造查询:

declare @sql nvarchar(max)
set @sql = 'USE [' + @database_name + '];' +
           'SELECT TOP 10 temperature_1, UTC FROM dbo.Data;';
exec (@sql)
于 2012-08-12T13:56:49.553 回答
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;
于 2012-08-12T14:20:27.933 回答
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;

另外为什么没有 order by 告诉 SQL Server 你的意思是TOP什么?

于 2012-08-12T14:44:10.753 回答
1

或者简单地使用限定名称,如此所述:

SELECT TOP 10 1000574..temperature_1, UTC FROM dbo.Data

当然,查询可以动态构建。

于 2012-08-12T14:09:48.600 回答