exec执行动态sql语句出现被截断问题

不胖到130不改名字 2017-10-18 11:14:43
简单说一下,
2k多行sql语句,里面创建了十几张表,
我现在想要表名是随机生成的,
于是就使用了exec执行字符串,
随机生成的表名作为参数传进去
于是问题来了,
一部分表名参数传进去后不影响,但是一部分表名参数传进去就导致了字符串被截取
本来思路也简单,大概如下

DECLARE @DataPPBomSUMTableName nvarchar(255)
--@sql 是动态sql语句
DECLARE @sql NVARCHAR(max)
--设置随机表名,这里只是暂时给个固定表名
SET @DataPPBomSUMTableName = 'DataPPBomSUM123'
set @sql = 'sql语句,并且传入参数'
exec(@sql)
--select @sql for xml path('')

这就是我很疑惑的地方,明明只是传参数,为什么一部分参数可以,一部分参数会导致字符串被截断呢?
我的@sql 定义的是NVARCHAR(max) 应该是不存在上限问题的
我所有的参数替换都是使用
表名 replaceall '+@DataPPBomSUMTableName+'

本来行数

传入参数后我用
select @sql for xml path('')
显示出了@sql
发现了字符串已经被截断
而且这个截断不是尾部被截,而是中间的某一部分代码被截没了


因为代码较多,所以我就放度盘了,麻烦各位老师有空的可以帮忙看一下
http://pan.baidu.com/s/1slHkJNn
...全文
957 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
深度格式 2017-10-24
  • 打赏
  • 举报
回复
我遇过类似的,有可能是变量+变量出错,例如 declare @av varchar(30) set @av=@av+'empty' --最后结果为空值 还有一种是你的动态sql太长了,需要用两个变量存放,我两个问题,我在做项目时都遇到过,你可以试下
  • 打赏
  • 举报
回复
引用 9 楼 yenange 的回复:
你把有问题的参数发出来看看

--注释1的参数是没有问题的,其他的是有问题的
set @DataPPBomTableName = 'DataPPBom123'--1
SET @DataPPBomSUMTableName = 'DataPPBomSUM123' --替换【DataPPBomSUM16394CJ】
SET @DataResultTableName = 'DataResult123' --替换【DataResult16394CJ】
SET @DataPPBomOutTableName = 'DataPPBomOut123' --替换【DataPPBomOut16394CJ】
SET @DataICMOTableName = 'DataICMO123' --替换【DataICMO16394CJ】
SET @DayAllItemInventoryTableName = 'DayAllItemInventory123'--1
SET @DataDetailTableName = 'DataDetail123'--1
SET @ICMOLISTTableName = '#ICMOLIST123' --替换【#ICMOLIST】
SET @DATA2TableName = '#DATA2123' --替换【#DATA2】
SET @POOderEntryListTableName = '#POOderEntryList123'--1
SET @ICMOINSPLISTTableName = '#ICMOINSPLIST123'--1
SET @SubContractEntryListTableName = '#SubContractEntryList123' --替换【#SubContractEntryList】
SET @DataResultTableName2 = '#DataResult123' --替换【#DataResult】
SET @BomDataTableName = '#BomData123' --替换【#BomData】
SET @DateListTableName = '#DateList123'--1
SET @TepICMOAllIdTableName = '#TepICMOAllId123'--1
SET @UpdateItemReplaceTableName = '#UpdateItemReplace123' --替换【#UpdateItemReplace】
SET @tempDsitinctSumFidTableName = '#tempDsitinctSumFid123'--1
SET @Temp_InvSumDataTableName = '#Temp_InvSumData123' --替换【#Temp_InvSumData】
SET @TempCharTableName = '#TempChar123'--1
SET @TempBomOpen_CharTableName = '#TempBomOpen_Char123' --替换【#TempBomOpen_Char】
SET @StockListTableName = '#StockList123'--1
SET @TempDateListTableName = '#TempDateList123'--1
SET @tempICMOTableName = '#tempICMO123' --替换【#tempICMO】
SET @tempPPBomTableName = '#tempPPBom123' --替换【#tempPPBom】
SET @DayItemInventoryTableName = '#DayItemInventory123' --替换【#DayItemInventory】
SET @DayItemInventory1TableName = '#DayItemInventory1123' --替换【#DayItemInventory1】
吉普赛的歌 2017-10-18
  • 打赏
  • 举报
回复
你把有问题的参数发出来看看
  • 打赏
  • 举报
回复
引用 7 楼 shoppo0505 的回复:
[quote=引用 6 楼 likelinsiyuan 的回复:] [quote=引用 3 楼 shoppo0505 的回复:] 你这个例子中见,我没看见哪里被截断了阿
截图里面,行数减少了,就是中间少了部分代码[/quote] 你对比下,看看是不是空白行阿[/quote] 是真的少了, 上面说的,部分参数传入后,是可以正常执行的, 而问题参数传入后,执行会报错,并且我用xml输出看了这段sql,中间确实是少了部分代码的
shoppo0505 2017-10-18
  • 打赏
  • 举报
回复
引用 6 楼 likelinsiyuan 的回复:
[quote=引用 3 楼 shoppo0505 的回复:] 你这个例子中见,我没看见哪里被截断了阿
截图里面,行数减少了,就是中间少了部分代码[/quote] 你对比下,看看是不是空白行阿
  • 打赏
  • 举报
回复
引用 3 楼 shoppo0505 的回复:
你这个例子中见,我没看见哪里被截断了阿
截图里面,行数减少了,就是中间少了部分代码
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
参数一个一个的加,看加到哪个参数的时候出问题了,然后再找问题原因。 2000多行的代码……这么长干什么的、
我现在是参数一个一个的加, 而且我知道哪几个参数会出问题,还是找不出原因,我看了问题参数传入的写法,感觉是没有问题的
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
http://blog.csdn.net/z10843087/article/details/77584905 看看我的博客能否帮到你
我觉得不是字符串长度限制的问题 因为我一开始就设置了nvarchar(max) 而且一是一部分参数传入才会出问题
shoppo0505 2017-10-18
  • 打赏
  • 举报
回复
你这个例子中见,我没看见哪里被截断了阿
二月十六 2017-10-18
  • 打赏
  • 举报
回复
参数一个一个的加,看加到哪个参数的时候出问题了,然后再找问题原因。
2000多行的代码……这么长干什么的、
OwenZeng_DBA 2017-10-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/z10843087/article/details/77584905 看看我的博客能否帮到你
繁花尽流年 2017-10-18
  • 打赏
  • 举报
回复
你这个实在太长了。而且没搞懂即使你要动态生成实体表名,中间数据处理过程完全可以用临时表搞定。 只需要最后动态创建和插入数据就行了。为嘛一开始就高拼接,实际没啥必要的。
吉普赛的歌 2017-10-18
  • 打赏
  • 举报
回复
引用 12 楼 likelinsiyuan 的回复:
[quote=引用 11 楼 yenange 的回复:] 参数太多了,看得难受。 先減少代码,缩小范围,在只有一两个表的情况下是否也如此?
就是如此 有问题的参数现在都没有传进去... 因为一传进去代码就执行不了[/quote] 我的意思就是你把SQL简化成只有两个表, 是否还出现这个错误? 如果还有这个错误, 把简化后的SQL及参数贴出来
  • 打赏
  • 举报
回复
引用 11 楼 yenange 的回复:
参数太多了,看得难受。 先減少代码,缩小范围,在只有一两个表的情况下是否也如此?
就是如此 有问题的参数现在都没有传进去... 因为一传进去代码就执行不了
吉普赛的歌 2017-10-18
  • 打赏
  • 举报
回复
参数太多了,看得难受。 先減少代码,缩小范围,在只有一两个表的情况下是否也如此?

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧