高分求救,存储过程如何传递带有单引号(')的参数?

gengchengxiang 2008-10-20 11:36:21
先看代码
存储过程代码
create procedure [dbo].[sp_eip1_GetTabs]
(
@PShowMobile nvarchar,
@PHidModCodes nvarchar(500)
)
as
begin
declare
@DTabID int,
@DTabName nvarchar(50),
@szSqlSel nvarchar(500),
@szSqlWhr nvarchar(500),
@szSqlOrd nvarchar(500)
select @szSqlSel='select TabID from Tabs'
select @szSqlWhr=' where dbo.fn_eip1_HasTabRight2(TabID,'3','''+@PHidModCodes+''')=N''Y'''
insert #NodeTB(TabID,TabName) execute(@szSqlSel+@szSqlWhr)
select * from #NodeTB
end
go

函数代码
create function [dbo].[fn_eip1_HasTabRight2]
( --return 'Y':has right, 'N':no right
@iPTabID int,
@iPUserID int,
@PHidModCodes nvarchar (500)
)
returns nvarchar(1)
as
begin
declare @DNodeID int,
@iPortalID int,
@szHasRight nvarchar(1)

select @iPortalID=PortalID from Tabs where TabID=@iPTabID and TabMode in (@PHidModCodes)
select @szHasRight=N'N'

......
end
go

在存储过程中调用函数fn_eip1_HasTabRight2 并将将参数 @PHidModCodes 传递给该函数,函数中用了in关键字,所以传递的参数中为带有单引号的值。
例如这么调用 exec sp_eip1_GetTabs '','N''WMM'',N''DRP'',N''EQP'',N''WMC'''
传递给存储过程的参数是'N''WMM'',N''DRP'',N''EQP'',N''WMC''' 在存储过程中调用函数,在传递给函数前参数已经变为'N'WMM',N'DRP',N'EQP',N'WMC'',这个很显眼错误
各位高手如何,此类错误如何解决。
...全文
603 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
等不到来世 2008-10-20
  • 打赏
  • 举报
回复
exec sp_eip1_GetTabs '','N''''WMM''''',N'''DRP''',N'''EQP''',N'''WMC''' 
-狙击手- 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fcuandy 的回复:]
用''来转义',记得这一点就可以了。
[/Quote
RPFly 2008-10-20
  • 打赏
  • 举报
回复
将单引号变成双引号就可以 了..
muzhenxing013 2008-10-20
  • 打赏
  • 举报
回复
思路:把你要传入的参数进行分拆,插入临时表或表变量里,然后在 in(select * from 表变量)就行。
注意:2000不支持insert into @a exec(@b),2005支持,2000里可以用临时表来解决
pt1314917 2008-10-20
  • 打赏
  • 举报
回复

--这样调用:
exec sp_eip1_GetTabs '', '''N''''WMM'''',N''''DRP'''',N''''EQP'''',N''''WMC'''''

fcuandy 2008-10-20
  • 打赏
  • 举报
回复
用''来转义',记得这一点就可以了。

幸运的意外 2008-10-20
  • 打赏
  • 举报
回复
楼主朋友,如果是字符串拼接的话,那么在在字符串中三个'表示实际的一个',四个'表示一个紧连的'也就是一个空字符的表达''.
如果程序中有过多的字符型变量拼接的话,那么建议使用系统存储过程sp_executesql,使用这个系统存储过程可以避免由于拼接字符串时不小心出现的单引号引发的错误.
muzhenxing013 2008-10-20
  • 打赏
  • 举报
回复
思路:把你要传入的参数进行分拆,插入临时表或表变量里,然后在 in(select * from 表变量)就行。
注意:2000不支持insert into @a exec(@b),2005支持,2000里可以用临时表来解决
中国风 2008-10-20
  • 打赏
  • 举报
回复
create procedure [dbo].[sp_eip1_GetTabs]
(
@PShowMobile nvarchar,
@PHidModCodes nvarchar(500)
)
as
begin
declare
@DTabID int,
@DTabName nvarchar(50),
@szSqlSel nvarchar(500),
@szSqlWhr nvarchar(500),
@szSqlOrd nvarchar(500)

create table #NodeTB(TabID int,TabName sysname)
select @szSqlSel='select TabID from Tabs'
select @szSqlWhr=' where dbo.fn_eip1_HasTabRight2(TabID,3,'''+@PHidModCodes+''')=N''Y'''
insert #NodeTB(TabID,TabName) execute(@szSqlSel+@szSqlWhr)
select * from #NodeTB
end
muzhenxing013 2008-10-20
  • 打赏
  • 举报
回复
Declare @ParamIDList Varchar(500)
Declare @Table_NameList table ( Name Varchar(100)) -- 建立表变量
Declare @Index_Param int /*参数 记录分隔符的位置*/
Declare @NeedParse varchar(500) /*参数 没有处理的字符串*/
set @ParamIDList='A301011020,A301011023'
Select @Index_Param=CharIndex(',', @ParamIDList)
if (@Index_Param=0)
begin /*一个名字组成*/
insert into @Table_NameList (Name) values(@ParamIDList)
end
else /*存在多个名字*/
begin
set @NeedParse =@ParamIDList
while (CharIndex(',', @NeedParse)>0)
begin
insert into @Table_NameList (Name) values(SubString(@NeedParse,1,CharIndex(',',@NeedParse)-1))
set @NeedParse =SubString(@NeedParse,CharIndex(',', @NeedParse)+1,len(@NeedParse)-CharIndex(',', @NeedParse))
end
insert into @Table_NameList (Name) values(@NeedParse)
end
muzhenxing013 2008-10-20
  • 打赏
  • 举报
回复
create table ppp (aa int identity(1,1),bb varchar(10) )
insert into ppp
select '1' union all
select '2' union all
select '3' union all
select '4' union all
select '5' union all
select '6'
alter proc pro
@aa varchar(10)
as
BEGIN
declare @a varchar(5),@b varchar(100)
set @a='1,2'
set @b='select '''+(select replace(@a,',','''union select ''')+'''')
declare @str table (aa varchar(10))
insert into @str
exec(@b)
select * from ppp where bb in (SELECT * FROM @STR)
END
EXEC PRO '1,2'
muzhenxing013 2008-10-20
  • 打赏
  • 举报
回复
没明白说啥
水族杰纶 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gengchengxiang 的回复:]
问题简化一些吧
把字符串 以这种形式 'N''WMM'',N''DRP'',N''EQP'',N''WMC''' 传递给函数,在函数中用在in中:
select @iPortalID=PortalID from Tabs where TabID=@iPTabID and TabMode in (@PHidModCodes)
为什么还是不行呢?
[/Quote]
--try
exec('select'+ @iPortalID+'=PortalID from Tabs where TabID='+@iPTabID+' and TabMode in ('+@PHidModCodes+')')
gengchengxiang 2008-10-20
  • 打赏
  • 举报
回复
解决了
baihualin1983 2008-10-20
  • 打赏
  • 举报
回复
可以把英文的单引号替换为中文的单引号。
gengchengxiang 2008-10-20
  • 打赏
  • 举报
回复
问题简化一些吧
把字符串 以这种形式 'N''WMM'',N''DRP'',N''EQP'',N''WMC''' 传递给函数,在函数中用在in中:
select @iPortalID=PortalID from Tabs where TabID=@iPTabID and TabMode in (@PHidModCodes)
为什么还是不行呢?

gengchengxiang 2008-10-20
  • 打赏
  • 举报
回复
还是没有解决啊

22,277

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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