• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

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

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啊,长度应该够长吧
...全文
398 点赞 收藏 40
写回复
40 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
和这句拼合的语句有关呢?
回复
加载更多回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2009-08-03 10:45
社区公告
暂无公告