2017-04-05 167 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... 

我正在使用SSMS 2016連接到SQL 2000服務器。對於上下文 - 我試圖使用臨時表和示例數據創建一個當前腳本的更通用版本(適用於生產數據),以備將來保存爲參考。

這是負責該錯誤代碼:在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

我已經添加了原代碼的問題。如果我使用'PRINT'而不是'EXEC'運行,它會在消息窗口中顯示我想要的內容。我甚至可以複製該結果並將其粘貼回編輯器,它會執行得很好... – CactusCake

+1

注 - sys.messages不是我的(古代)服務器上的有效對象。但是'select * from master.dbo.sysmessages where error = 203 and msglangid = 1033' does not work。謝謝! – CactusCake

+0

很高興你在你的系統上找到它。忘了你使用的是2000.順便說一下,你有可能升級的任何機會? 2000年已經退出近十年的支持。 –

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