动态sql问题

yiyi_wx 2008-02-24 09:55:02
我现在有一个存储过程中的一句动态sql是从客户端传值的
举例来说就是 假如我在客户端生成一句sql

String sql = "Select isnull(aa,'') aa from tb";

现在需要把该sql传给存储过程
但因为存储过程中用的动态sql
所以 isnull(aa,'')此处就不能用单引号 要用双引号了
可是我的sql本身又是一个字符串 不能直接用""
请问该怎么解决呢?多谢~
...全文
54 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yiyi_wx 2008-02-25
嘿嘿~我结了哦~
回复
-狙击手- 2008-02-25
小依依真好
回复
yiyi_wx 2008-02-25
嗯,是的是的,本来这样结我还挺不甘心的,因为他们说的里我的预期目的还有一定差距
我多给你点分哦~
^_^
回复
-狙击手- 2008-02-25
晕,我说得最靠谱呀
回复
yiyi_wx 2008-02-25
本来上面两位可以一人10分的,现在要分出来一些了~
呵呵,如果我刚才动作快一些。。。。。就没小狙击的份咯~
吼吼~
回复
-狙击手- 2008-02-25
小依依
回复
-狙击手- 2008-02-25
给我分吧
回复
yiyi_wx 2008-02-25
哇,狙击前辈,我差一点就结了~
回复
yiyi_wx 2008-02-25
搞清楚了,可以这样写

declare @sql varchar(8000)
@sql='Select isnull(aa,'''') aa from tb'
exec sp_executesql @sql
回复
-狙击手- 2008-02-25
create table tb(ID int,            ACCNO char(5))
insert into tb values(1, '8888')
insert into tb values(2, '8888')
insert into tb values(3, '8888')
insert into tb values(4, '8888')
insert into tb values(5, '7777')
insert into tb values(6, '7777')
insert into tb values(7, '7777')
insert into tb values(8, '7777')
insert into tb values(9, '7777')
go


create proc test
@ss varchar(100)
as
begin
declare @s varchar(1000)
set @s = 'select * from ('+replace(@ss,'''','''''')+') a'
exec (@s)
end
go

declare @s varchar(1000)
set @s = 'select isnull(accno,'') as c from tb'
exec test @s

drop proc test

drop table tb

/*


c
-----
8888
8888
8888
8888
7777
7777
7777
7777
7777

(所影响的行数为 9 行)
*/



这个意思?
回复
zefuzhang2008 2008-02-24
declare @sql varchar(8000)
@sql='Select isnull(aa,char(39)+char(39)) aa from tb'
exec sp_executesql @sql
回复
中国风 2008-02-24

--------------------------------------------------------------------------------

动态sql语句基本语法
1 :普通SQL语句可以用Exec执行

eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错



declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
回复
中国风 2008-02-24
在程序中调用存储过程:
exec T @s--程序定义的字符串

回复
changjiangzhibin 2008-02-24
CSDN中很多动态SQL的好贴,可搜一下
回复
中国风 2008-02-24
这不影响啊,这是程序的生成是这样的格式。。

create proc T(@s nvarchar(1000))
as
exec(@s)--引用就行了..
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-02-24 09:55
社区公告
暂无公告