存储过程中如果要在where后面加变量该用什么变量呢?

时间:2021-08-07 19:53:36
CREATE PROCEDURE [dbo].[P_searchNum]
    @str_Condition varchar(20)
AS
BEGIN
SET NOCOUNT ON;
        select count(*) from t1 where  @str_Condition  = 'aaa')
END

我想在上面红字处,即where后面的列名处加个变量,那第一个红字处该用什么变量类型来定义呢?
引用的时候该如何引用呢?

谢谢了

22 个解决方案

#1


CREATE PROCEDURE [dbo].[P_searchNum]
  @str_Condition varchar(20)
AS
BEGIN
 exec('select count(*) from t1 where '+@str_Condition+'  = ''aaa''') 
END 

#2


谢谢,虚心请教下,begin后面要用exec呢?

#3


我试后为什么会出现这个错误呢?
关键字 'exec' 附近有语法错误。

#4


哦 再看看啊

#5


create table t1(name varchar(50))
insert into t1 select 'bbb'
insert into t1 select 'aaa'
insert into t1 select 'aaa'
insert into t1 select 'aaa'

CREATE PROCEDURE [dbo].[P_searchNum]  
@str_Condition varchar(20) 
AS 
BEGIN  
exec('select count(*) from t1 where '+@str_Condition+' = ''aaa''') 
END 

exec [dbo].[P_searchNum] 'name'


3


没问题吧!

#6


ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @str_Condition varchar(20),
   @num int output
AS
BEGIN
SET NOCOUNT ON;
select id=identity(int,1,1),* into #rownum from tb_Car
set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+@str_search+ '%')
drop table #rownum
    return @num
END

去掉exec后存储过程可以运行,但是运行后出现这个错误,麻烦高手给看看,万分感谢了.
declare @test int
exec P_searchNum '2','a',@test output
select @test

上面代码的出错内容如下:
在将 varchar 值 'select top 1 id from #rownum where a like 2%' 转换成数据类型 int 时失败。

#7


怎么不直接问这个啊...汗

#8


不好意思,我本来以为问多了,反而会乱...
麻烦高手了,扣谢了。

#9


呵呵,表重要字段帖一下吧,免的你改完有不对

#10


键临时表有什么用哦?没排序的,top 1会乱的,因为top1你都不知道哪条

#11


谢谢,
tb_Car表的全部字段有以下内容:
CarID, varchar(20), not null,
CarName, varchar(20), not null,
PilotName, varchar(20),
VehicleType, varchar(20),
另外:
    select id=identity(int,1,1),* into #rownum from tb_Car
    set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+@str_search+ '%')
这两句是取出记录select对应记录在当前td_car表的相应行,
我的目前就是取出对应数据在td_car的表的对应行,返回行号到@num就可以了。

麻烦大哥了,万分感谢了。

#12


去掉where后面的变量后,只带一个变量和回参该过程可以正常运行,且返回值正常
ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @num int output
AS
BEGIN
SET NOCOUNT ON;
select id=identity(int,1,1),* into #rownum from tb_Car
set @num = (select top 1 id from #rownum where CarID like @str_search + '%')
drop table #rownum
    return @num
END

#13


set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+convert(nvarchar(10),@str_search)+ '%')

这样,
PS:
动态SQL里面不能应用局部临时表....
所以,你上面的写法有问题。

#14


行,按你的写吧,等一会啊

#15


引用 13 楼 hery2002 的回复:
SQL codeset@num=('select top 1 id from #rownum where'+@str_Condition+'like'+convert(nvarchar(10),@str_search)+'%')
这样,
PS:
动态SQL里面不能应用局部临时表....
所以,你上面的写法有问题。

create table #(id int)
insert into # select 1
insert into # select 2
insert into # select 3

exec('select * from #')

呵呵,花和尚...

#16


你这个id是临时新增的,取出来也没有实际意义啊,
没有排序,

#17


谢谢,hery2002 兄弟..
我按照您那样的把set @num整行给改掉后,还是有运行错误,
错误信息如下:
在将 nvarchar 值 'select top 1 id from #rownum where CarID like 2%' 转换成数据类型 int 时失败。
麻烦大哥帮看下,多谢了。

#18


引用 15 楼 wzy_love_sly 的回复:
引用 13 楼 hery2002 的回复:
SQL codeset@num=('select top 1 id from #rownum where'+@str_Condition+'like'+convert(nvarchar(10),@str_search)+'%') 
这样, 
PS: 
动态SQL里面不能应用局部临时表.... 
所以,你上面的写法有问题。 
 
create table #(id int) 
insert into # select 1 
insert into # select 2 
insert into # select 3 

exec('select * from #') 

呵呵,花和尚...

o,和表变量搞混淆了.....

#19


create table tb_Car(
CarID varchar(20) not null,
CarName varchar(20) not null,
PilotName varchar(20),
VehicleType varchar(20))

insert into tb_car select '1','abc','ba','ca'
insert into tb_car select '2','cc','dd','ee'
insert into tb_car select '3','ff','gg','hh'


ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @str_Condition varchar(20),
   @num int output
AS
BEGIN
    SET NOCOUNT ON;
    select id=identity(int,1,1),* into #rownum from tb_Car
declare @sql nvarchar(4000)
    set @sql = 'select top 1 @id=id from #rownum where '+@str_Condition+' like '''+@str_search+ '%'''
exec sp_executesql @sql,N'@id int output',@num output 
    drop table #rownum
END

declare @test int
exec P_searchNum 'c','CarName',@test output
select @test


2

#20


晕菜...
set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+convert(nvarchar(10),@str_search)+ '%')

根本不能这样写, 
@num 为int
后面一长串为varchar类型,
肯定不能用set..
估计要用 sp_excutesql 作为output参数传出来.

#21


楼上是印刷机呀~~~这么快....
测试ok.太感谢您了。hand~~~

结贴

#22


.....

#1


CREATE PROCEDURE [dbo].[P_searchNum]
  @str_Condition varchar(20)
AS
BEGIN
 exec('select count(*) from t1 where '+@str_Condition+'  = ''aaa''') 
END 

#2


谢谢,虚心请教下,begin后面要用exec呢?

#3


我试后为什么会出现这个错误呢?
关键字 'exec' 附近有语法错误。

#4


哦 再看看啊

#5


create table t1(name varchar(50))
insert into t1 select 'bbb'
insert into t1 select 'aaa'
insert into t1 select 'aaa'
insert into t1 select 'aaa'

CREATE PROCEDURE [dbo].[P_searchNum]  
@str_Condition varchar(20) 
AS 
BEGIN  
exec('select count(*) from t1 where '+@str_Condition+' = ''aaa''') 
END 

exec [dbo].[P_searchNum] 'name'


3


没问题吧!

#6


ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @str_Condition varchar(20),
   @num int output
AS
BEGIN
SET NOCOUNT ON;
select id=identity(int,1,1),* into #rownum from tb_Car
set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+@str_search+ '%')
drop table #rownum
    return @num
END

去掉exec后存储过程可以运行,但是运行后出现这个错误,麻烦高手给看看,万分感谢了.
declare @test int
exec P_searchNum '2','a',@test output
select @test

上面代码的出错内容如下:
在将 varchar 值 'select top 1 id from #rownum where a like 2%' 转换成数据类型 int 时失败。

#7


怎么不直接问这个啊...汗

#8


不好意思,我本来以为问多了,反而会乱...
麻烦高手了,扣谢了。

#9


呵呵,表重要字段帖一下吧,免的你改完有不对

#10


键临时表有什么用哦?没排序的,top 1会乱的,因为top1你都不知道哪条

#11


谢谢,
tb_Car表的全部字段有以下内容:
CarID, varchar(20), not null,
CarName, varchar(20), not null,
PilotName, varchar(20),
VehicleType, varchar(20),
另外:
    select id=identity(int,1,1),* into #rownum from tb_Car
    set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+@str_search+ '%')
这两句是取出记录select对应记录在当前td_car表的相应行,
我的目前就是取出对应数据在td_car的表的对应行,返回行号到@num就可以了。

麻烦大哥了,万分感谢了。

#12


去掉where后面的变量后,只带一个变量和回参该过程可以正常运行,且返回值正常
ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @num int output
AS
BEGIN
SET NOCOUNT ON;
select id=identity(int,1,1),* into #rownum from tb_Car
set @num = (select top 1 id from #rownum where CarID like @str_search + '%')
drop table #rownum
    return @num
END

#13


set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+convert(nvarchar(10),@str_search)+ '%')

这样,
PS:
动态SQL里面不能应用局部临时表....
所以,你上面的写法有问题。

#14


行,按你的写吧,等一会啊

#15


引用 13 楼 hery2002 的回复:
SQL codeset@num=('select top 1 id from #rownum where'+@str_Condition+'like'+convert(nvarchar(10),@str_search)+'%')
这样,
PS:
动态SQL里面不能应用局部临时表....
所以,你上面的写法有问题。

create table #(id int)
insert into # select 1
insert into # select 2
insert into # select 3

exec('select * from #')

呵呵,花和尚...

#16


你这个id是临时新增的,取出来也没有实际意义啊,
没有排序,

#17


谢谢,hery2002 兄弟..
我按照您那样的把set @num整行给改掉后,还是有运行错误,
错误信息如下:
在将 nvarchar 值 'select top 1 id from #rownum where CarID like 2%' 转换成数据类型 int 时失败。
麻烦大哥帮看下,多谢了。

#18


引用 15 楼 wzy_love_sly 的回复:
引用 13 楼 hery2002 的回复:
SQL codeset@num=('select top 1 id from #rownum where'+@str_Condition+'like'+convert(nvarchar(10),@str_search)+'%') 
这样, 
PS: 
动态SQL里面不能应用局部临时表.... 
所以,你上面的写法有问题。 
 
create table #(id int) 
insert into # select 1 
insert into # select 2 
insert into # select 3 

exec('select * from #') 

呵呵,花和尚...

o,和表变量搞混淆了.....

#19


create table tb_Car(
CarID varchar(20) not null,
CarName varchar(20) not null,
PilotName varchar(20),
VehicleType varchar(20))

insert into tb_car select '1','abc','ba','ca'
insert into tb_car select '2','cc','dd','ee'
insert into tb_car select '3','ff','gg','hh'


ALTER PROCEDURE [dbo].[P_searchNum]
   @str_search varchar(20),
   @str_Condition varchar(20),
   @num int output
AS
BEGIN
    SET NOCOUNT ON;
    select id=identity(int,1,1),* into #rownum from tb_Car
declare @sql nvarchar(4000)
    set @sql = 'select top 1 @id=id from #rownum where '+@str_Condition+' like '''+@str_search+ '%'''
exec sp_executesql @sql,N'@id int output',@num output 
    drop table #rownum
END

declare @test int
exec P_searchNum 'c','CarName',@test output
select @test


2

#20


晕菜...
set @num = ('select top 1 id from #rownum where '+@str_Condition+' like '+convert(nvarchar(10),@str_search)+ '%')

根本不能这样写, 
@num 为int
后面一长串为varchar类型,
肯定不能用set..
估计要用 sp_excutesql 作为output参数传出来.

#21


楼上是印刷机呀~~~这么快....
测试ok.太感谢您了。hand~~~

结贴

#22


.....