解决SQL错误:sp_executesql - 消息911,级别16,状态1

时间:2012-08-12 13:45:30

标签: sql sql-server sql-server-2008-r2

我需要在各种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'不存在。确保正确输入名称。*

错误在哪里?

谢谢,彼得

4 个答案:

答案 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)

或者只是使用限定名称,如记录here

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

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