首页 > 解决方案 > 在 SQL Server 中执行 sp_executesql 超出长度

问题描述

我的 SQL Server 版本是 SQL Server 2008 R2。

in语句中有大约 100 行。

我使用此 SQL 进行动态查询:

DECLARE @DynamicDate nvarchar(100) 
DECLARE @SQLString_1 nvarchar(max)

SET @DynamicDate='20181021'
SET @SQLString_1 =  
     N'select  *    
 from T1_'+@DynamicDate+' w      
 left join      
 T2 c      
 on w.ASSET_ID=c.DEVICE_ID      
 left join      
 T3 cm      
 on c.DEVICE_ID=cm.ASSET_ID      
 left join      
 T4 gm      
 on cm.GROUP_ID=gm.GROUP_ID      
 left join      
 T5 em      
 on w.EVENT_ID =em.EVENT_ID      
 and w.EVENT_CATEGORY_ID=em.EVENT_CATEGORY_ID      
 left join T6 sa      
 on w.PROCESS_NAME=sa.PROCESS_NAME
 where 
 w.ASSET_ID in (''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
   ……
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'',
''{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}''
)
 '
print(@SQLString_1)
--EXECUTE sp_executesql @SQLString_1

当我打印 sql. 输出如下:

select                   
 *    
 from T1_20181021 w      
 left join      
 T2 c      
 on w.ASSET_ID=c.DEVICE_ID      
 left join      
 T3 cm      
 on c.DEVICE_ID=cm.ASSET_ID      
 left join      
 T4 gm      
 on cm.GROUP_ID=gm.GROUP_ID      
 left join      
 T5 em      
 on w.EVENT_ID =em.EVENT_ID      
 and w.EVENT_CATEGORY_ID=em.EVENT_CATEGORY_ID      
 left join T6 sa      
 on w.PROCESS_NAME=sa.PROCESS_NAME
 where 
 w.ASSET_ID in (
'{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}',
'{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}',
  ……
'{XXXXXXXX-XXXX

只打印了一部分。

当我使用sp_executesql @SQLString_1

错误是:

消息 105,级别 15,状态 1,第 96 行字符串“{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}”后没有关闭引号。消息 102,级别 15,状态 1,第 96 行“{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}”附近的语法不正确。

我使用了关键字maxin @SQLString_1,

所以我不能使用execute sp_executesql`,它似乎不起作用。

我该如何解决?

标签: sql-serversql-server-2008-r2

解决方案


关于您问题的印刷部分,print仅限于 4000 个符号。如果你想在控制台中转储更长的文本,你可以像这样打印它:

print substring(@SQLString_1,    1, 4000)
print substring(@SQLString_1, 4001, 4000)
print substring(@SQLString_1, 8001, 4000)

根据需要添加尽可能多的 4k 块。每个命令都会在一个新行上打印它的块,所以你的查询会被打乱一点,但是这些额外的换行符很容易找到和修复:

left join T6 sa
on w.PROCES <-- 找到这个地方并将这些行连接在一起,得到原始查询

S_NAME=sa.PROCESS_NAME

在哪里

关于查询错误,您的查询字符串看起来被转换为非最大类型,因此被截断为 4000 个字符。检查你的连接。如有必要,将您的非最大部分转换为 nvarchar(max)。


推荐阅读