2012-02-23 29 views
5

は誰もが私の文で確認することができますSQL Serverの...宣言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"を宣言しなければなりません。 @strSQLで、その後

私は何をしたいことは、変数@tblNameにテーブル名を取得し、例えば@strSQL変数

でいくつかのデータを挿入... @tblNameの結果はCustomerInfo

ですI私のInsertコマンドでテーブル名として@tblNameの結果を使用します。

したがって、@strSQL変数は次のようになります。あなたは(最後に)単一DECLARE文、you only put the type onceで複数の変数を宣言し

INSERT INTO CustomerInfo VALUES(......) 
+1

[SQL Declare Variables](http://stackoverflow.com/questions/9407703/sql-declare-variables)の可能な複製 –

答えて

2

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

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以降では、sysobjectssysindexesの使用を中止する必要があります。代わりに、ほぼ同じ情報を含む新しいsysスキーマを使用してください。

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

+0

oops、私の悪い、私はSQLを使用していますServer 2008、nway..thanks 4 d help –

+0

別のこと...挿入コマンドの前に@strSQLでIF文を使用する場合は、最初に挿入する値があるかどうかを確認したいからですテーブルには存在しません。 ご迷惑をおかけして申し訳ありません...私はSQLを勉強し始めています。 –

2

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) 

何を:

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

元の質問はMySql(これは私が答えたもの)に関するものだと誓っていたかもしれません。 SQL ServerはDECLAREステートメントで重複した型定義を許可しているようです。 – colithium

+0

この回答は間違っています。 SQL Serverは 'DECLARE @tblName、@strSQL varchar(MAX)'を許可しません。 'declare @i int、@t varchar(max);' –

1

これが本当に実行できるものでなければなりません見積もりでは、それは文字列であり、SQL Serverが文として実行することを期待していないことを意味します。文字列内の変数と同じものを、あなたは引用できません。

+0

'DSINTINCT' **と**' TOP 1'は少し大きすぎます..... ifあなたは1つの結果しか持っていません。とにかく重複している可能性はありません..... –

+0

似た名前のテーブルがあるかもしれないので、クラッシュしないようにしてください。 –