2012-02-23 3 views
5

이 사람이 내 문을 확인 할 수 SQL 서버 ...선언 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"을 선언해야합니다.

는 내가하고 싶은 것은 변수 @tblName에 테이블 이름을 얻고 예를 들어 @strSQL 변수

에서 일부 데이터를 삽입입니다 ... @tblName의 결과는 @strSQL I에 CustomerInfo

다음이다 내 삽입 명령에서 내 테이블 이름으로 @tblName의 결과를 사용하게됩니다.

따라서 @strSQL 변수는 다음과 같습니다. 당신이 (말에) 하나의 DECLARE 문, you only put the type once 둘 이상의 변수를 선언

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

가능한 복제본 [SQL 선언 변수] (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

죄송하지만, 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

원래 질문에 대한 맹세 할 수 있었다. SQL Server에서 DECLARE 문에 중복 된 형식 정의를 허용합니다. – colithium

+0

이 대답은 잘못되었습니다. SQL Server는'DECLARE @tblName, @strSQL varchar (MAX)'를 허용하지 않습니다. * declare @i int, @t varchar (max); ' –

1

이 정말 실행할 수있는 무언가가 있어야한다 따옴표로 문자열을 의미하고 SQL 서버가 명령문으로 실행한다는 것을 기대하지는 않습니다. 문자열의 변수와 동일한 것으로, 따옴표로 묶을 수 없습니다.

+0

'DSINTINCT' **와 **'TOP 1'은 조금 너무 많습니다 ..... if 당신은 단지 1 개의 결과를 가지고 있습니다, 어쨌든 중복을 가질 수는 없습니다 ..... –

+0

비슷한 테이블이있을 수 있기 때문에 충돌이 일어나지 않도록하고 싶습니다. –