为什么我的查询会出错?

wenw 2003-07-27 02:19:37
语句1:
insert into ware_sell_collect ( fct_date,ware_symbol, ware_price, ware_number) select fct_date,ware_symbol,convert(char,sum(convert(bigint,ware_price))) as ware_price,convert(char,count(*)) as ware_number from ware_sellrec where fct_date=@collect_date group by ware_symbol,fct_date
在程序执行时候出错了,提示
INSERT 失败,因为下列 SET 选项的设置不正确: 'ANSI_NULLS., QUOTED_IDENTIFIER'。
但我把它改成
语句2:
insert into ware_sell_collect ( fct_date,ware_symbol, ware_price, ware_number) ( select fct_date,ware_symbol,convert(char,sum(convert(bigint,ware_price))) as ware_price,convert(char,count(*)) as ware_number from ware_sellrec where fct_date='20030630' group by ware_symbol,fct_date)
或者
语句3:
select fct_date,ware_symbol,convert(char,sum(convert(bigint,ware_price))) as ware_price,convert(char,count(*)) as ware_number from ware_sellrec where fct_date=@collect_date group by ware_symbol,fct_date

都不会出错。这个问题到底错在哪?
@collect_date是存储过程的参数,赋值为'20030630'时候语句3查询不出错,放到最上面的语句1中出错,但把语句1中的变量直接用常量代替就不出错。
...全文
98 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenw 2003-07-29
  • 打赏
  • 举报
回复
的确是主键的影响,可是我不明白为什么同样的语句在sql查询分析器中确可以正常执行,看样子存储过程不能做太复杂的操作!
zjcxc 元老 2003-07-29
  • 打赏
  • 举报
回复
有可能,你先去掉它试试
wenw 2003-07-29
  • 打赏
  • 举报
回复
To zjcxc(邹建)
我的 ware_sell_collect中还有自动生成的字段(主键),是由fct_date+ware_symbol生成的,是不是它的影响呢?
yangvxin1 2003-07-28
  • 打赏
  • 举报
回复
up
yijiayi 2003-07-28
  • 打赏
  • 举报
回复
我试了你的三个语句都可以执行的,你再试试看.
wenw 2003-07-28
  • 打赏
  • 举报
回复
我的所有字段和参数都是char类型,在查询分析器中做测试发现的错误。请仔细看语句1、2和3的区别,语句1和2的区别只是一个用的参数来查询,一个用的是常量来查询,结果语句2可以正确执行并返回信息,语句3是语句1中使用了参数的那一部份,调用方法和变量类型都没有改,但是语句3可以正常执行,所以,前面的比较说明这个语句是可以实现并且数据库的结构与语句是匹配的,应该是参数的问题才对,可是语句3又证明了参数的设置和调用方法是正确的,所以我确实弄不明白,你们可以自己试一下类似的语句,我的功能只不过是把一个表中的日营业数据统计到一个统计表中,难道要一条条添加到统计表中吗?

zjcxc 元老 2003-07-28
  • 打赏
  • 举报
回复
问题应该不是在存储过程上,你用我下面的测试,我的电脑上试过没问题的.:

--创建数据环境
create table ware_sell_collect(
fct_date char(8)
,ware_symbol char(10)
,ware_price char(10)
,ware_number char(10)
)
go
create table ware_sellrec(
fct_date char(8)
,ware_symbol char(10)
,ware_price char(10)
,ware_number char(10)
)
go
insert into ware_sellrec
select '20030102','b','100','1'
union all select '20030101','1','200','11'
union all select '20030101','b','300','101'
go

--创建存储过程
create procedure test @collect_date varchar(8)
as
insert into ware_sell_collect(fct_date,ware_symbol,ware_price,ware_number)
select fct_date,ware_symbol
,convert(char,sum(convert(bigint,ware_price))) as ware_price
,convert(char,count(*)) as ware_number
from ware_sellrec
where fct_date=@collect_date
group by ware_symbol,fct_date
go

--调用存储过程
exec test '20030101'

--删除数据测试环境
drop table ware_sell_collect,ware_sellrec
drop procedure test
wenw 2003-07-28
  • 打赏
  • 举报
回复
如果在SQL查询器中直接执行是不会出错,但是把它放到存储过程中,然后再到sql查询器中执行存储过程的话就会出现只有语句一的时候出错,用语句二或者语句三代替语句一都可以正常运行。
zjcxc 元老 2003-07-27
  • 打赏
  • 举报
回复
把表结构贴出来,我帮你做个测试
Rivulet119 2003-07-27
  • 打赏
  • 举报
回复
"@collect_date是存储过程的参数"
你这个参数是在前台传入的吗?
如果在查询分析器中传入参数能,存储过程能能正常执行的话,应该是你前后台的时间数据类型不兼容所致。建议你输入参数使用字符型,在存储过程中进行转换。SQL Server的自定义函数有此问题。
wenw 2003-07-27
  • 打赏
  • 举报
回复
help me!
wenw 2003-07-27
  • 打赏
  • 举报
回复
@collect_date 是char(8),问题是语句1和2的差别只是一个用的变量,一个用的常量,所以数据库的结构肯定没有问题,如果是变量定义或者引用错误,那么语句3就应该出错,所以我不知道我的sql语句错在哪儿。
wenw 2003-07-27
  • 打赏
  • 举报
回复
问题就是我在SQL分析器里面输入的过程名和参数都没有变,但当存储过程中的语句变成2和3的时候,结果都正确,但是1的时候就出错了。
zjcxc 元老 2003-07-27
  • 打赏
  • 举报
回复
你的表结构是如何定义的?

@collect_date 是如何定义的?
xiaoxin761128 2003-07-27
  • 打赏
  • 举报
回复
Delcare @collect_date varchar(8)
xiaoxin761128 2003-07-27
  • 打赏
  • 举报
回复
你把存储过程在SQL查询分析器里执行应该就可以了
zosky 2003-07-27
  • 打赏
  • 举报
回复
查一查你输入的变量到底是什么
zosky 2003-07-27
  • 打赏
  • 举报
回复
应该是你输入的变量有问题

34,587

社区成员

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

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