0

さまざまな SQL Server インスタンスで特定のスクリプトを実行する必要があります。彼らは別の ID でデータベースを使用します。ただし、すべてのデータベースには、処理する必要がある同じテーブル (同じ名前と構造) があります。そのため、データベースの名前を検出し、それを文字列変数に設定し、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 @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;

また、SQL Serverに意味を伝えるための順序がないのはなぜTOPですか?

于 2012-08-12T14:44:10.753 に答える
2

これを行うもう1つの方法:

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 に答える
1

または、ここに記載されているように、単に修飾名を使用します。

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

もちろん、クエリは動的に作成できます。

于 2012-08-12T14:09:48.600 に答える