web-dev-qa-db-ja.com

SQL宣言変数

誰でも私の声明を確認できますか...

DECLARE @tblName varchar(MAX), 
        @strSQL varchar(MAX)

SET @tblName ='SELECT DISTINCT o.name as TableName 
                 FROM sysobjects o 
                 JOIN sysindexes x on o.id = x.id  
                WHERE o.name LIKE ''%empty%'''  

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')'
EXEC (@strSQL)

私のエラーは...

メッセージ1087、レベル15、状態2、行1
テーブル変数「@tblName」を宣言する必要があります。

16
Argel Joseph

_@tblName_プロパティは、外側のスコープ(「通常の」コード行のスコープ)に存在しますが、文字列で構築しているSQLの内側のスコープには存在しません。

行を変更して読む必要があります:

_SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')'
_

そしてそれはうまく動作するはずです。

また、SQL Serverのバージョンについては言及していませんが、SQL Server 2005以降では、sysobjectsおよびsysindexesの使用を停止する必要があります。代わりに、新しいsysを使用してくださいほぼ同じ情報を含むスキーマ-より簡単に入手できます。クエリを次のように変更します。

_SET @tblName ='SELECT DISTINCT t.name as TableName 
               FROM sys.tables t
               INNER JOIN sys.indexes i on i.object_id = t.object_id  
               WHERE t.name LIKE ''%empty%'''  
_

新しいsysスキーマで利用できるものと、それを最大限に活用する方法の詳細については、 MSDN:SQL Serverシステムカタログのクエリ を参照してください。

「rsbarro」が指摘したように、このSQLステートメントを引用符で囲むのは奇妙です-EXEC(...)も使用してこのステートメントを実行していますか??しかし、その後、どのようにして値を_@tblName_プロパティに割り当てますか?本当に理にかなっていない.....

このクエリを実際に実行して値を取得する場合は、次のようなものが必要です。

_ SELECT TOP 1 @tblName = t.name
 FROM sys.tables t
 INNER JOIN sys.indexes i on i.object_id = t.object_id  
 WHERE t.name LIKE '%empty%'
_

単一の値を取得するためには、sureになる_TOP 1_が必要です-そうでない場合、このステートメントは失敗する可能性があります(複数の行がある場合)選択済み)。

12
marc_s

あなたが何をしようとしているのか正確にはわからないが、私はあなたがこのような何かが欲しいと思う:

DECLARE @tblName varchar(MAX), @strSQL varchar(MAX)
SET @tblName = 
    (select distinct o.name as TableName 
     from sysobjects o 
     join sysindexes x on o.id = x.id  
     where o.name LIKE '%empty%')
SET @strSQL = 'INSERT INTO [' + @tblName + '] VALUES(''trylng'', ''1'')'
exec (@strSQL)

そうは言っても、ここで注意すべきことがいくつかあります。 SELECT DISTINCTが単一のレコード以外を返す条件を処理する必要があります。また、@strSQLが常に同じ値を持つ場合(WHERE句で変数が使用されていないため)動的SQL(@tblName内)を構築する必要性を本当に理解していません。

6
rsbarro