截断的SQL Server错误消息

问题描述:

这不是关于截断的错误消息。相反,错误消息本身(来自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 

错误信息都存储在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年已经退出近十年的支持。 –

我有同样的错误。现在它适用于我。

我删除了'为字段_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