web-dev-qa-db-ja.com

SQL変数の宣言-SQL Server

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

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のテーブル名を取得し、@strSQL変数にデータを挿入することです

たとえば、@tblNameの結果はCustomerInfoです。

次に、@strSQLで、@tblNameの結果を挿入コマンドのテーブル名として使用します。

したがって、@strSQL変数は次のようになります。

INSERT INTO CustomerInfo VALUES(......)
6
Argel Joseph

あなたの他の質問に対する私の答えからこれを試してください:

 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%'

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

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

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

2
marc_s

1つのDECLAREステートメントで複数の変数を宣言する場合、 型を1回だけ置く (最後に):

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

これは実際に実行できるものでなければなりません:

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

SET @tblName =  (SELECT DISTINCT TOP 1  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)

引用符で囲まれたものは、それが文字列であり、SQLサーバーがそれをステートメントとして実行することを期待しないことを意味します。文字列内の変数と同じことはできません。

1
Simon Wang