2017-04-05 9 views
1

잘라 내기 오류 메시지가 아닙니다. 오히려 오류 메시지 자체 (SSMS에서)는 잘 렸습니다. 그게 나 한테 무슨 말을하려는거야? 전체 오류 메시지를 복구 할 수있는 방법이 있습니까?SQL Server 오류 메시지가 잘림

Msg 203, Level 16, State 2, Line 80 
The name 'SELECT 
SUM(CASE WHEN #actual_types.typ = 'AA' THEN #actual_types.qty ELSE 0 END) AS 'AA_Qty', 
SUM(CASE WHEN #actual_types.typ = 'AB' THEN #actual_types.qty ELSE 0 END) AS 'AB_Qty', 
SUM(CASE WHEN #actual_types.typ = 'AC' THEN #actual_types.qty ELSE 0 END) AS 'AC_Qty', 
SUM(CASE WHEN #actual_types.typ = 'BA' THEN #actual_types.qty ELSE 0 END) AS 'BA_Qty', 
SUM(CASE WHEN #actual_types.typ... 

SQL 2000 서버에 연결된 SSMS 2016을 사용하고 있습니다. 문맥을 위해 - 나는 임시 테이블과 샘플 데이터를 사용하여 현재의 스크립트 중 더 일반적인 버전을 만들어 내고 싶었습니다 (프로덕션 데이터와 잘 작동합니다). SQL Server의

CREATE TABLE #possible_types 
    (typ varchar(2)) 

CREATE TABLE #actual_types 
    (typ varchar(2), 
    dt  smalldatetime, 
    qty int) 

INSERT #possible_types 
SELECT  'AA' 
UNION SELECT 'AB' 
UNION SELECT 'AC' 
UNION SELECT 'BA' 
UNION SELECT 'BB' 
UNION SELECT 'BC' 

INSERT #actual_types 
SELECT  'AA', '2015-01-01', 123 
UNION SELECT 'AA', '2016-01-01', 321 
UNION SELECT 'AA', '2017-01-01', 222 
UNION SELECT 'BA', '2016-01-01', 777 
UNION SELECT 'BC', '2017-01-01', 456 

DECLARE @qry varchar(8000) 
SELECT @qry = 'SELECT' + CHAR(13) 
SELECT @qry = @qry + s.sql_gen 
    FROM 
    (SELECT DISTINCT 'SUM(CASE WHEN #actual_types.typ = '''+ typ + ''' THEN #actual_types.qty ELSE 0 END) AS ''' + typ + '_Qty'',' + char(13) AS [sql_gen] 
    FROM #possible_types) s 
SELECT @qry = LEFT(@qry, LEN(@qry) - 2) -- gets rid of last comma and carriage return 
SELECT @qry = @qry + ' 
         FROM #actual_types 
         WHERE #actual_types.dt >= ''2017-01-01'' 
         ' 
--PRINT @qry 
EXEC @qry; 

DROP TABLE #possible_types 
DROP TABLE #actual_types 

답변

3

오류 메시지가 sys.messages의에 저장됩니다

오류에 대한 책임이있는 코드이다. 제공된 정보를 사용하여 메시지 테이블을 쿼리 할 수 ​​있습니다.

select * from sys.messages 
where message_id = 203 
    and language_id = 1033 --1033 is English (assumed you can read English) 

"이름 '%. * ls'은 (는) 올바른 식별자가 아닙니다."를 반환합니다.

분명히 코드에 뭔가 이상한 점이 있습니다. 귀하의 질의를 공유 할 수 있으며 문제의 실제 원인을 파악하는 데 도움이 될 수 있습니다.

+0

합니다. 'EXEC' 대신에'PRINT' 명령을 사용하면 메시지 창에서 원하는 것을 정확하게 보여줍니다. 그 결과를 복사해서 에디터에 다시 붙이면 괜찮아 질 것입니다. – CactusCake

+1

주 - sys.messages는 고대 서버에서 유효한 객체가 아닙니다. 그러나 'select * from master.dbo.sysmessages where error = 203 and msglangid = 1033'이 작동합니다. 감사! – CactusCake

+0

시스템에서 발견되어 기쁩니다. 당신이 2000 년을 사용하고 있다는 사실을 잊어 버렸습니다. 언젠가는 언제라도 업그레이드 할 수 있습니까? 2000 년은 이제 10 년 가까이지지를받지 못했습니다. –

1

동일한 오류가 발생했습니다. 이제 그것은 나를 위해 작동합니다.

필드 이름에 대해 '_Qty'을 (를) 제거했습니다. 실제로 쿼리가 작동하도록 만들 필요는 없습니다.

는 또한 내가 편집 :

DECLARE @qry nvarchar(4000) 

편집
EXECUTE sp_executesql @qry; 

전체 코드 : 나는이 질문에 대한 원래의 코드를 추가 한

CREATE TABLE #possible_types 
    (typ varchar(2)) 

CREATE TABLE #actual_types 
    (typ varchar(2), 
    dt  smalldatetime, 
    qty int) 

INSERT #possible_types 
SELECT  'AA' 
UNION SELECT 'AB' 
UNION SELECT 'AC' 
UNION SELECT 'BA' 
UNION SELECT 'BB' 
UNION SELECT 'BC' 

INSERT #actual_types 
SELECT  'AA', '2015-01-01', 123 
UNION SELECT 'AA', '2016-01-01', 321 
UNION SELECT 'AA', '2017-01-01', 222 
UNION SELECT 'BA', '2016-01-01', 777 
UNION SELECT 'BC', '2017-01-01', 456 

DECLARE @qry nvarchar(4000) 
SELECT @qry = 'SELECT' + CHAR(13) 
SELECT @qry = @qry + s.sql_gen 
    FROM 
    (SELECT DISTINCT 'SUM(CASE WHEN #actual_types.typ = '''+ typ + ''' THEN #actual_types.qty ELSE 0 END) AS ' + typ + '_Qty,' + char(13) AS [sql_gen] 
    FROM #possible_types) s 
SELECT @qry = LEFT(@qry, LEN(@qry) - 2) -- gets rid of last comma and carriage return 
SELECT @qry = @qry + ' 
         FROM #actual_types 
         WHERE dt >= ''2017-01-01'' 
         ' 
PRINT @qry 
EXECUTE sp_executesql @qry; 

DROP TABLE #possible_types 
DROP TABLE #actual_types 
+0

아, 좋은 형사 일, 고마워! 흥미로운 점은'EXECUTE sp_executesql @qry;'와'EXEC @qry;'는 같은 일을하지 않는다는 것입니다. 내 특정 질문은 서버의 메시지에 관한 것이므로 @Sean에 체크 표시가 있지만 분명히 +1이라고 생각합니다. – CactusCake

+0

나는 당신에 동의합니다. – etsa