1. ホーム
  2. sql

[解決済み] 変数としてのテーブル名

2022-04-22 20:31:15

質問

私はこのクエリを実行しようとしています。

declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename

この場合、以下のようなエラーが発生します。

Msg 1087, レベル 16, ステート 1, ライン 5

テーブル変数 "@tablename"を宣言する必要があります。

テーブル名を動的に入力させるには、どのような方法がありますか?

どのように解決するのですか?

ご質問のような静的なクエリの場合、テーブル名とカラム名は静的である必要があります。

動的なクエリの場合は、完全な SQL を動的に生成し、sp_executesql を使用してそれを実行する必要があります。

ここでは、異なるデータベースの同じテーブル間のデータを比較するために使用するスクリプトの例を示します。

静的なクエリです。

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

の名前を簡単に変更したいので tableschema ということで、こんなダイナミッククエリを作ってみました。

declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)

set @schema = 'dbo'
set @table = 'ACTY'

set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'

EXEC sp_executesql @query

動的なクエリには細かい配慮が必要で、メンテナンスも大変なので、一読されることをお勧めします。 ダイナミックSQLの呪いと恵み