高手请进 存储过程中字符串长度问题

anteye 2009-08-03 10:45:33
各位高手,我在SQL2K中的增加了一个存储过程,里面用到以下一些语句:

...
DECLARE @SQL nvarchar(2000)
...
set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName)
( SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List
where ((OutStorage=''山即东墨'') or (InStorage=''山即东墨''))
and (TabDate>=''2009-7-1'' and TabDate<''2009-7-31'') order by JewelCode )'

print @SQL

...

但是奇怪的问题出现了,我在调试此存储过程中,发现赋过值的SQL,被截取了.如下:
'Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName)
( SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List
where ((OutStorage=''山即东墨'') or (InStorage=''山即东墨''))
and (TabDate>=''2009-7-1'' and TabDate<''2009-7-31'') or'
请问大家这是什么问题?
我前面定义的长度为2000啊,长度应该够长吧
...全文
457 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 anteye 的回复:]
应该是我没有表达清楚,

我在查询分析器内采用 "调试"存储过程 功能时遇到到上面的问题,但如果直接将语句直接在分析器内运行的话,则没有问题

有谁用过  "调试"存储过程的功能吗?

[/Quote]

SQL的调试过程是垃圾
不能用的
anteye 2009-08-07
  • 打赏
  • 举报
回复
应该是我没有表达清楚,

我在查询分析器内采用 "调试"存储过程 功能时遇到到上面的问题,但如果直接将语句直接在分析器内运行的话,则没有问题

有谁用过 "调试"存储过程的功能吗?
anteye 2009-08-05
  • 打赏
  • 举报
回复
试了,
我发现@Tmp首先是长度好象都只取到了一部分, @SQL又只取一部分,所以就出了问题

大家可以运行一下我上面给出的代码,逻辑上不复杂.

帮帮忙,谢谢
anteye 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 feixianxxx 的回复:]
引用 30 楼 anteye 的回复:
多谢各位的关注.
今天一下火车就又来调试这个问题.

你这火车 从昨晚 到今晚。。久
[/Quote]

上火车,下火车,找宾馆:) 24小时就去了
feixianxxx 2009-08-05
  • 打赏
  • 举报
回复
试了我给你的方法?
anteye 2009-08-05
  • 打赏
  • 举报
回复
大家上面分析的问题可能对我都不大有用:(

我要说明几点
第一,我这是SQL2K内写的存储过程,而不是在查询分析器内写的代码,我将存储过程简化了一下如下:

CREATE PROCEDURE proStocksInOutBYJewelCode
@StorageName varchar(50),
@FromDate varchar(20),
@EndDate varchar(20)
AS
Begin

DECLARE @SQL nvarchar(2000),
@Tmp nvarchar(2000)


set @Tmp='SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List where (OutStorage='''+@StorageName+''' or InStorage='''+@StorageName+''') and (TabDate>='''+@FromDate+''' and TabDate<'''+@EndDate+''' ) order by JewelCode'

set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) '+@Tmp

/*
按道理此时的SQL应该为:Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List where (OutStorage='山东即墨' or InStorage='山东即墨') and (TabDate>='2009-07-01' and TabDate<'2009-07-31') order by JewelCode

但在查询分析器内调试存储过程到此步时,却发现SQL并没有不是这些字符,而是
N'Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List'

*/

EXEC(@SQL)



end
GO

第二: 如果直接将上面的代码放在查询分析器内运行,而不是作为调试存储过程的话,则很正确.如下:

DECLARE @SQL nvarchar(2000) ,
@Tmp nvarchar(2000) ,
@StorageName varchar(50),
@FromDate varchar(20),
@EndDate varchar(20)

set @StorageName='山东即墨'
set @FromDate='2009-07-01'
set @EndDate='2009-07-31'


set @Tmp='SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List where (OutStorage='''+@StorageName+''' or InStorage='''+@StorageName+''') and (TabDate>='''+@FromDate+''' and TabDate<'''+@EndDate+''')'
print @Tmp

set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) '+@Tmp
print @SQL

则所有都是正常的

所以我觉得是不是在调试存储过程中有些意外啊

大家都来试试吧,很奇怪!!!
要是解决不了,我还得再开贴了
feixianxxx 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 anteye 的回复:]
多谢各位的关注.
今天一下火车就又来调试这个问题.
[/Quote]
你这火车 从昨晚 到今晚。。久
anteye 2009-08-05
  • 打赏
  • 举报
回复
多谢各位的关注.
今天一下火车就又来调试这个问题.
hui_hui_2007 2009-08-05
  • 打赏
  • 举报
回复
我要说明几点
第一,我这是SQL2K内写的存储过程,而不是在查询分析器内写的代码,
----------------------------------------------------------------------
你的这话让人摸不着头脑,存贮过程本身不就是在查询分析器写的吗?
与在查询分析中运行有区别吗?区别何在,本来就是不一回事吗?

你先说说,你的存贮过程是通过什么编辑环境写进去的,看来我分析有不可见字符是有道理的。
振乾 2009-08-05
  • 打赏
  • 举报
回复
在后台赋值的时候
sqlparameter parm=new sqlparamter(SqlDbtype.varchar,10000,~~);
估计是你定义的时候把长度写少了。
cxmcxm 2009-08-04
  • 打赏
  • 举报
回复
可能
1.估计是里面有看不见的字符,导致输出时被截断.(可用<记事本>先处理字符串)
2.查询分析器的结果输出未设置为最大,默认好象只有400,所以看到的输出被截断
SQL77 2009-08-04
  • 打赏
  • 举报
回复
去掉括号,改成NVARCHAR应该可以了,
dingpin 2009-08-04
  • 打赏
  • 举报
回复
等待结果...
hui_hui_2007 2009-08-04
  • 打赏
  • 举报
回复
我感觉你的代码行中一定有特殊的字符,否则不会这样的。
你仔细查查,解决了分享一下成果。
findusefulthings 2009-08-04
  • 打赏
  • 举报
回复
高深,我看不懂
yutian_31 2009-08-03
  • 打赏
  • 举报
回复
之前我也遇到过,无论你如何改变字符串的长度都不行,原因是 1 ,2,3句的结尾都有空格,
可以测试下,用+号连接起来就可以了。
DECLARE @SQL nvarchar(2000)
set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName)' ---1
+ '( SELECT distinct JewelCode,JewelName FROM vi_JewelStocksInOut_List' ---2
+ 'where ((OutStorage=''山即东墨'') or (InStorage=''山即东墨''))' ----3
+ 'and (TabDate>=''2009-7-1'' and TabDate <''2009-7-31'') order by JewelCode )'
print @SQL
feixianxxx 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 anteye 的回复:]
好的,谢谢
我在去赶火车了,
下车后我试试,谢谢

[/Quote]
呵呵 火车还上网了。。
anteye 2009-08-03
  • 打赏
  • 举报
回复
好的,谢谢
我在去赶火车了,
下车后我试试,谢谢
feixianxxx 2009-08-03
  • 打赏
  • 举报
回复
set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) ' 
EXEC(@SQL+ @Tmp )

改成这样试试
anteye 2009-08-03
  • 打赏
  • 举报
回复
是不是
set @SQL='Insert into tb_Tmp_StocksInOut_JewelCode(JewelCode,JewelName) ' + @Tmp
和这句拼合的语句有关呢?
加载更多回复(19)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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