说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请教这两个语句不同在哪里???

编辑:说三道四文库 发布时间:2018-08-20 03:03
HTML文档下载 WORD文档下载 PDF文档下载
在我的存储过程中有下面两个语句

SELECT A,B
FROM table
WHERE (A LIKE @a) AND (B = @b) AND 
      (C = @c) AND (D= @d) AND (E='y')

EXEC('select A,B from table where A like'+ @a+' and B= '+@b+' and  C= '+@c+' and D= '+@d+' and E='+'''y'''
为什么上面的EXEC()和select 的结果不一样呢???
EXEC()可以得到正确的值。
--试试第二句改为
exec('select A,B from table where A like '''
+ @a+''' and B='''+@b+''' and  C= '''+@c+''' and D='''+@d+''' and E=''y'''
try:
exec('select A,B from table where A like '''
+ @a+''' and B='''+@b+''' and  C= '''+@c+''' and D='''+@d+''' and E=''y'''
你的参数是怎样传递的?

create table t1 (a char(10),b char(10))
insert t1 values('asdfgh','zxcvb')
insert t1 values('qwert','yuiop')
insert t1 values('hj123gd','yui45')

declare @a varchar(10)
set @a = 'a'
exec('select * from t1 where a like '+@a)    -- 注意当成 where a like a 即 字段 like 字段
set @a = 'yu'
exec('select * from t1 where a like '+@a)  

a          b          
---------- ---------- 
asdfgh     zxcvb     
qwert      yuiop     
hj123gd    yui45     

服务器: 消息 207,级别 16,状态 3,行 1
Invalid column name 'yu'.
把你的两种情况下的结果集贴上来几行看看啊。
SELECT A,B
FROM table
WHERE (A LIKE '%'+@a+'%') AND (B = @b) AND 
      (C = @c) AND (D= @d) AND (E='y')

EXEC('select A,B from table where A like'''+ @a+''' and B= '''+@b+''' and  C= '''+@c+''' and D= '''+@d+''' and E='+'''y'''
谢谢DX,我把整个存储过程帖出来
create PROCEDURE [pro_V]
(@a char(25)='''1%''',
@b char(10)='''123''',
 @c char(3)='''E''',
 @d  char(3)='''P'''
 )
 
AS  
 SELECT A,B
FROM table
WHERE (A LIKE @a) AND (B = @b) AND 
      (C = @c) AND (D= @d) AND (E='y')

EXEC('select A,B from table where A like'+ @a+' and B= '+@b+' and  C= '+@c+' and D= '+@d+' and E='+'''y'''

SELECT的结果集为空,EXEC的结果集为2条符合条件的记录
SELECT A,B
FROM table
WHERE (A LIKE '%'+@a+'%') AND (B = @b) AND 
      (C = @c) AND (D= @d) AND (E='y')

EXEC('select A,B from table where A like'''+ @a+''' and B= '''+@b+''' and  C= '''+@c+''' and D= '''+@d+''' and E='+'''y'''
上面两个应该能得到一样的结果!
--问题应该出在你的变量定义上,你用下面的试试:

create PROCEDURE [pro_V]
(@a varchar(25)='''1%''',
@b varchar(10)='''123''',
 @c varchar(3)='''E''',
 @d  varchar(3)='''P'''
 )
 
AS  
 SELECT A,B
FROM table
WHERE (A LIKE @a) AND (B = @b) AND 
      (C = @c) AND (D= @d) AND (E='y')

EXEC('select A,B from table where A like'+ @a+' and B= '+@b+' and  C= '+@c+' and D= '+@d+' and E='+'''y'''

--上面的错了,真实的原因是(为了方便说明问题,我调整了一下格式):
create PROCEDURE [pro_V]
@a char(25)='''1%''',
@b char(10)='''123''',
@c char(3)='''E''',
@d  char(3)='''P'''
AS  
SELECT A,B FROM [table]  --这里应该是表名
WHERE A LIKE @a          --这里,@a的值是'1%',而正常的应该是1%,所以结果与下面不同
AND B=@b AND C=@c AND D=@d AND E='y'

EXEC('select A,B from table where A like'
+@a+' and B='+@b+' and  C='+@c+' and D='+@d+' and E=''y''')
go
我真的是很郁闷了:(,我把过程中的语句改了
create PROCEDURE [pro_V]

@c varchar(3)='''E'''
 )
AS  
SELECT A,B FROM table WHERE C = @c AND AND E='y' 执行后影响行数为0
如果这样写SELECT A,B FROM table WHERE C ='E' AND AND E='y' 执行结果就是正确的

create PROCEDURE [pro_V]

@c varchar(3)='E'
 )
AS  
SELECT A,B FROM table WHERE C = @c AND AND E='y' 
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘