sql-server - 在 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}”附近的语法不正确。
我使用了关键字max
in @SQLString_1
,
所以我不能使用execute sp_executesql`,它似乎不起作用。
我该如何解决?
解决方案
关于您问题的印刷部分,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)。
推荐阅读
- python - python - 如何在Pyplot中绘制一个具有n个偶数面积切片的圆?
- optimization - fsolve 在 python 中的差分进化函数中非常慢收敛
- logistic-regression - 关于逻辑回归
- javascript - 如何在电子中显示打印预览?
- sql - 如何指望加入具有 2 个条件的表?
- java - Jsoup - 如何使用自动关闭创建我自己的标签
- go - 如何恢复我用 gorm deletedAt 软删除的数据
- c# - c#中两个列表交叉连接后将数据合并到单个字典中
- angular - 如何将必填字段添加到 mat-button-toggle-group 数组?
- java - 编写一个 while 循环,打印所有可被 10 整除且小于给定数 n 的正数