誰でも私の声明を確認できますか...
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」を宣言する必要があります。
_@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
_が必要です-そうでない場合、このステートメントは失敗する可能性があります(複数の行がある場合)選択済み)。
あなたが何をしようとしているのか正確にはわからないが、私はあなたがこのような何かが欲しいと思う:
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
内)を構築する必要性を本当に理解していません。