2012-07-16 7 views
0

두 개의 별도 저장 프로 시저에서 #temp 테이블을 사용하고 있습니다. 하나의 경우에는 제대로 작동하지만 다른 경우에는 '잘못된 개체 이름 #temp'오류가 발생합니다.잘못된 개체 이름 #temp 동적 SQL 및 필드 이름 배열

첫 번째 경우 : 그것은 확인하고있다

SELECT SubsID, 
       SubsName, 
       AbbrName 
INTO   #TEMP 
FROM   SubsList 
WHERE  CAST (SubsID AS VARCHAR(10)) LIKE '%' + @intRight + '%' 
        OR SubsName LIKE '%' + @intRight + '%' 

.

이 SQL을보다 동적으로 만들려면 QUOTENAME을 사용하고 다음과 같이 변경하십시오. 1. @ColName, @sourceName, @intField 및 @txtField의 데이터 유형을 sysname으로 만들었습니다. 2. Select and Drop SQL에서 오류가 발생하여 sysname (value : #temp가 전달됨)으로 param @tableName을 제거했습니다. 3. @ColName에 필드 이름 하나를 전달 중입니다. 세 개의 필드 이름을 모두 통과하면 오류가 발생했습니다. 4. @cmd nvarchar (max)를 선언하고 실행을 위해 SQL을 할당합니다.

SET @cmd = N'Select ' + QUOTENAME(@ColName) + 
      N' INTO #temp from ' + QUOTENAME(@sourceName) + 
      N' where CAST(' + QUOTENAME(@intField) + N' AS VARCHAR(10)) like ''%' + @strVal + 
      N'%'' or ' + QUOTENAME(@txtField) + ' like ''%' + @strVal + N'%''' --working 
EXEC sp_executesql @cmd; 

SELECT * 
FROM #temp; 

DROP TABLE #temp; 

EXEC sp_executesql @cmd를 EXEC (@cmd)로 변경했지만 오류가 남아 있습니다.

잘못된 개체 이름 오류가 발생하지만 #temp를 ## temp로 변경하면이 오류가 발생하지 않습니다.

첫 번째 질문 : #temp를 사용하는 경우이 오류의 원인은 무엇일까요? 두 번째 질문 : 필드 이름 배열을 만들어 저장 프로 시저에 전달하는 방법은 무엇입니까?

+0

SQL 삽입을 피하기 위해 실행되는 문자열에'sp_executesql'을 단순히 연결하는 대신'@ strVal'을 매개 변수로 전달해야합니다. –

답변

2

임시 테이블이 exec가 완료된 후에 범위를 벗어났습니다. 'exec '또는'sp_executesql '은 해당 범위에서 실행됩니다. 따라서 임시 테이블과 변수처럼 생성 된 모든 것은 실행이 끝나자 마자 파괴되거나 범위를 벗어납니다. 저장된 프로 시저와 같은 것 같습니까?

문제를 해결하려면 메인 코드에서 임시 테이블을 만든 다음 dynmic sql을 사용하여 삽입 한 다음 주 코드에서 읽습니다.

+0

EXEC와 sp_executesql이 아주 잘 설명되어있는 다음 링크를 방문하십시오. 심지어 예제도 이해하기 쉽습니다. http://www.sommarskog.se/dynamic_sql.html#sp_executesqlong –

관련 문제