2012-04-22 2 views
2

참고 : 나는긴 동적 쿼리를 실행하는 방법 (이상 4000) 문자 - 다시

나는이 사이트에 게시물 수십 읽을 시간을 촬영했습니다 ... SQL 서버 2008 R2에서 실행 해요 쿼리가 4000자를 초과하는 동적 SQL을 실행하는 방법에 대한 다른 사이트. 나는 제안 된 12 가지 이상의 솔루션을 시도했다. - 쿼리 @ SQLQuery1의 끝에서 잘립니다이 나를 위해 작동하지 않습니다

EXEC (@SQLQuery1 + @SQLQuery2) 

: 일치는 할 다음 4000 문자 변수에 쿼리를 분할하는 것 같다.

이제 공백 등을 반복하여 사용하여 사람들이 긴 쿼리를 "강제 실행"하는 샘플을 보았습니다. 그러나 이것은 실제 쿼리입니다.하지만 이보다 조금 정교합니다.

"Company_A_ItemView"라는 이름의 SQL보기가 있습니다.

나는 10 개의 회사가 있는데, 똑같은보기를 다른 이름으로 만들고 싶습니다. "Company_B_ItemView" "Company_C_ItemView" ..etc.

도움을 제공하는 경우 여러 가지 이유가 있는지 물어 보지 말고 단지 내가 이런 식으로해야한다고 받아들이십시오.

각 회사마다 자체 테이블 집합이 있고 CREATE VIEW 문은 여러 테이블을 이름으로 참조합니다. 여기에 간단한 예제이지만, 쿼리의 총 길이는 약 6000 자, 기억

는 생각이

그럼, 내가 현재하고있는 중이 야 것은

CREATE view [dbo].[Company_A_ItemView] as 
select 
WE.[Item No_], 
WE.[Location Code], 
    LOC.[Bin Number], 
[..more fields, etc.] 
from 
[Company_A_Warehouse_Entry] WE 
left join 
[Company_A_Location] LOC 

... 당신이 얻을 :

. CREATE VIEW 문의 내용을 2 개의 선언 된 변수 (Declared Variables)로 가져옵니다.

Set @SQLQuery1 = (select text 
        from syscomments 
        where ID = 1382894081 and colid = 1) 
Set @SQLQuery2 = (select 
        from syscomments 
        where ID = 1382894081 and colid = 2) 

SQL은 긴 정의를 저장하는 방법입니다. 뷰를 만들면 텍스트가 여러 syscomments 레코드에 저장됩니다. 필자의 경우보기는 3591 자의 텍스트 청크로 첫 번째 syscomment 레코드로 분할되고 나머지 텍스트는 두 번째 레코드에 있습니다. 나는 왜 SQL이 syscomment 필드에 4000 문자를 사용하지 않는지 전혀 모른다. 그리고 그 진술은 한 마디로 깨졌습니다.

모든 예제에서 모든 @SQLQueryxxx 변수는 varchar (max)로 선언되어 있습니다. 나는 또한 같은 결과와 함께 그들을 nvarchar (max)와 varchar (8000)과 nvarchar (8000)로 선언 해 보았습니다.

b. 그런 다음 "Company_A"에 대해 "검색 및 바꾸기"를 수행하고이를 "Company_B"로 바꿉니다. 아래 코드에서 변수 "@CompanyID"는 처음에 "Company_B"로 설정됩니다.

SET @SQLQueryNew1 = @SQLQuery1 
SET @SQLQueryNew1 = REPLACE(@SQLQueryNew1, 'Company_A', @CompanyID) 
SET @SQLQueryNew2 = @SQLQuery2 
SET @SQLQueryNew2 = REPLACE(@SQLQueryNew2, 'Company_A',@CompanyID) 

c. 나는 다음 시도 :

EXEC (@SQLQueryNew1 + @SQLQueryNew2) 

메시지가 반환 @ SQLQueryNew1, 예를 들어 말에서 잘립니다 문을 실행하려고 나타냅니다 쿼리 텍스트의 약 80 %.

새로운 결과를 새로운 varchar (최대) 및 nvarchar (최대)에 CAST'ing했습니다. 행운이 없습니다. 원본 쿼리를 새 varchar (최대) 및 nvarchar (최대) CAST'ing 시도했습니다.) - 행운이 없다

원래 CREATE VIEW 문을 검색 한 결과를 살펴 봤지만 문제가 없습니다.

Set @SQLQuery1 = (select VIEW_DEFINITION) 
        FROM [MY_DATABASE].[INFORMATION_SCHEMA].[VIEWS] 
        where TABLE_NAME = 'Company_A_ItemView')` 

이 하나가 CREATE VIEW

Set @SQLQuery1 = (SELECT (OBJECT_DEFINITION(@ObjectID)) 

의 첫 번째 4000 자 I의 경우를 반환

나는 같은 원래 CREATE VIEW 문을 검색하는 다양한 방법을 시도했습니다 do a

SELECT LEN(OBJECT_DEFINITION(@ObjectID)) 

정확한 길이의 쿼리 (예 : 5191)를 반환하지만, @ SQLQuery1에서 확인하거나 시도하십시오

EXEC(@SQLQuery1), the statement is still truncated. 

c. 쿼리를 검색 한 후 쿼리의 텍스트를 조작하고 있기 때문에 결과 변수가 4000 자로 잘린 상태라는 몇 가지 참조가 있습니다. 내가 대체 할 때 결과를 CAST'ing했습니다.

SET @SQLQueryNew1 = SELECT (CAST(REPLACE(@SQLQueryNew1, 
           'Company_A', 
           @CompanyID) AS varchar(max)) 

같은 결과입니다.

다른 방법 (예 :보기를 만들기위한 저장 프로 시저 만들기)이 있다는 것을 알고 있습니다. 그러나 뷰가 개발 중이며 다소 유동적이어서, CREATE VIEW의 텍스트를 저장된 proc 안에 배치하는 것은 번거로운 일입니다. 내 목표는 Company_A의 뷰를 가져 와서 여러 번 반복 할 수있게하는 것입니다. Company_B의 뷰 이름과 테이블 이름, Company_C의 뷰 이름과 테이블 이름 등을 제외하면 여러 번 사용할 수 있습니다.

거기에 누군가가 있는지 궁금합니다. 누가 긴 SQL "CREATE VIEW"명령문을 조작하고 그것을 실행하려고 시도했는지.

답변

4

그냥 VARCHAR (MAX) 또는 NVARCHAR (MAX)를 사용합니다. 그들은 EXEC (문자열)에 잘 작동합니다.


참고

,이 방법 SQL 저장 긴 정의를 것을

주 - 뷰를 만들 때, 그것은 여러 syscomments의 기록에 텍스트를 저장합니다.

올바르지 않습니다. 이것은 을 SQL Server 2000에서 수행하는 방법입니다. SQL Server 2005 이상에서는 sys.sql_modules의 단일 항목에 NVARCHAR (MAX)로 저장됩니다.

syscomments은 아직 주위에 있지만 호환성을 위해 읽기 전용으로 유지됩니다.


그래서 @ SQLQuery1,2 등을 변경해야합니다. 변수를 단일 NVARCHAR (MAX) 변수에 저장하고 대신 sys.sql_modules 테이블의 [definition] 열에서 View 코드를 가져옵니다.

모든 입력 인수가 (N) VARCHAR (MAX)가 아닌 경우 (N) VARCHAR (4000) 출력으로 되돌아가는 특정 기능이 있으므로 문자열 조작에주의해야합니다. (죄송합니다, 어느 것이지 모르지만 REPLACE()가 하나 일 수 있습니다). 실제로, 이것은 당신의 시험에있는 순전히 혼란을 일으키는 원인이 될지도 모른다.

0

는 각 SQL 부분이

4000 바이트를 초과 (텍스트 파일로 각 부분을 복사하여 바이트 단위로 파일 크기를 테스트) did't해야 nvarchar(4000) 로 SQL 변수 (@ SQLQuery1 ...) 선언
관련 문제