Sql 即使在使用适当的函数后也不会删除尾随空格
我只是想从字符串变量中删除尾随空格。 下面是示例代码:Sql 即使在使用适当的函数后也不会删除尾随空格,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我只是想从字符串变量中删除尾随空格。 下面是示例代码: Set @Tree_ID='1.23 ' Set @Tree_ID = LTRIM(RTRIM(@Tree_ID)) 但令我惊讶的是,领先空间并没有被移除。我单独做了同样的事情,效果很好。但不知何故,它并没有在我的存储过程中修剪空间 下面是我的存储过程 ALTER procedure [dbo].[SP_Web_Calculate_Interest] -- 23,1,'2014-04-01','2015-03-19','','
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
但令我惊讶的是,领先空间并没有被移除。我单独做了同样的事情,效果很好。但不知何故,它并没有在我的存储过程中修剪空间
下面是我的存储过程
ALTER procedure [dbo].[SP_Web_Calculate_Interest] -- 23,1,'2014-04-01','2015-03-19','','kiran.divate','COMP7',1
@FGRPNo int,
@Company_No int,
@From_Date datetime,
@To_Date datetime,
@CC_TID varchar(200),
@UserName varChar(100),
@HostName varChar(100),
@DispMode int=1
As
Begin
Declare @Tree_ID char(30)
Declare @TempTable Table(Group_No smallint,Company_No smallint,Group_Name char(50),Tree_ID varchar(30),Is_Fixed char(1))
If @FGRPNo > 0
Begin
if @DispMode =1
Begin
Insert into @TempTable(Group_No ,Company_No,Group_Name ,Tree_ID ,Is_Fixed )
select distinct g.Group_No,g.Company_No, g.group_name,g.Tree_ID,g.Is_Fixed
from account_group G inner join Account a
on a.Tree_ID like '%.' + ltrim(rtrim(CAST(g.Group_No as varchar(10)))) + '.%'
where (a.company_no=@Company_No and a.account_no
in ( select Account_No
from Interest_Percent
where Company_No=@Company_No and Int_Rate >0 and effective_Date between @From_Date and @To_Date)
and g.group_no=@FGRPNo
and (g.company_no = 0 or g.company_no=@Company_No))
order by g.group_no
End
Else
Begin
Insert into @TempTable(Group_No ,Company_No,Group_Name ,Tree_ID ,Is_Fixed )
select distinct g.Group_No,g.Company_No, g.group_name,g.Tree_ID,g.Is_Fixed
from account_group G inner join Account a
on a.Tree_ID like '%.' + ltrim(rtrim(CAST(g.Group_No as varchar(10)))) + '.%'
where (a.company_no=@Company_No and a.account_no
in ( select Account_No
from Interest_Percent
where Company_No=@Company_No and Int_Rate >0 and effective_Date between @From_Date and @To_Date)
and g.Parent_group_no= @FGRPNo
and (g.company_no = 0 or g.company_no=@Company_No))
order by g.group_no
End
End
Else
Begin
Insert into @TempTable(Group_No ,Company_No,Group_Name ,Tree_ID ,Is_Fixed )
select distinct g.Group_No,g.Company_No, g.group_name,g.Tree_ID,g.Is_Fixed
from account_group G inner join Account a
on a.Tree_ID like '%.' + ltrim(rtrim(CAST(g.Group_No as varchar(10)))) + '.%'
where (a.company_no=@Company_No and a.account_no
in ( select Account_No
from Interest_Percent
where Company_No=@Company_No and Int_Rate >0 and effective_Date between @From_Date and @To_Date)
and (g.company_no = 0 or g.company_no=@Company_No))
order by g.group_no
End
Declare @CompNo int
Declare cur_temp SCROLL CURSOR FOR
Select Group_No ,Tree_ID,Company_No from @TempTable
FOR READ ONLY
OPEN cur_temp
FETCH first FROM cur_temp into @FGRPNo ,@Tree_ID,@CompNo
WHILE (@@fetch_status <> -1)
Begin
if @CompNo =0
Begin
Set @Tree_ID = Convert(varchar(10),@Company_No) + '.' + @Tree_ID
end
Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
Exec SP_Calculate_Interest @FGRPNo,@Company_No,@Tree_ID,@From_Date,@To_Date,@CC_TID,@UserName,@HostName
End
Close cur_Temp
deallocate cur_Temp
--Exec SP_Web_GetAccountInterest @FGRPNo,@Tree_ID ,@UserName ,@HostName ,@Company_no ,'G',@CC_TID ,@BalanceAmount output ,@InterestAmount output
--Select @BalanceAmount
--Select @InterestAmount
if @DispMode >1
Begin
Declare @TempTable2 Table(Account_No int,Account_Name char(50),Tree_ID char(30),parent_group_no smallint)
Insert into @TempTable2(Account_No ,Account_Name,Tree_ID ,parent_group_no )
select Distinct A.Account_No, A.Account_Name, A.Tree_ID, A.parent_group_no
from account A Where A.parent_group_no = @FGRPNo and A.company_no=@Company_No and a.account_no
in (select Account_No from Interest_Percent
where Company_No=@Company_No and Int_Rate >0
and effective_Date between @From_Date and @To_Date) order by A.Account_No
Declare @Acc_No int
Declare cur_temp2 SCROLL CURSOR FOR
Select Account_No ,Tree_ID from @TempTable2
FOR READ ONLY
OPEN cur_temp2
FETCH first FROM cur_temp2 into @Acc_No ,@Tree_ID
WHILE (@@fetch_status <> -1)
Begin
Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
Exec SP_Calculate_Interest @Acc_No,@Company_No,@Tree_ID,@From_Date,@To_Date,@CC_TID,@UserName,@HostName
End
Close cur_Temp2
deallocate cur_Temp2
End
End
Set@Tree\u ID=Convert(varchar(10),@Company\u No)+.+@Tree\u ID
的@Tree\u ID的值是1.23,后面有空格,所以当我执行Set@Tree\u ID=REPLACE(@Tree\u ID,,'')时,它不应该在if语句结束后立即删除空格吗
但当我在调试器中添加watch时,它仍然是一样的 您可以使用
尝试使用以下方法:
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(@Tree_ID, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
结果:| 1.23 |
它工作得很好,但作为一个建议。小心制表符空格或输入空格(例如,当文本取自备忘录时)
请参阅带有选项卡空间的此ex:
declare @Tree_ID varchar(100)
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
print '|'+@Tree_ID+'|'
并应用于您的存储过程…可能工作正常编辑:问题是@Tree\u ID使用的是数据类型CHAR(30)
CHAR始终填充足够的空间以使用其完整长度。如果不需要尾随空格,则需要使用VARCHAR。@Tree\u ID
是字符(30)
。因此,无论如何修剪或替换空格,始终为30个字符
你可以试试varchar<代码>声明@Tree\u ID varchar(30)
我替换了以下代码:
Declare @Tree_ID char(30)
与:
Declare @Tree_ID varchar(30)
这对我来说很好。因此,这意味着无论是
LTRIM
、RTRIM
还是Replace
函数都没有问题,这些函数在静态分配(char
)上都不起作用,当我将其更改为varchar
时,它工作得很好,我当然可以,但我正在思考我的代码为什么不起作用!由于一些隐藏的原因,这也不起作用,我也知道它应该起作用。你能提供正确打印的单词以及错误的单词吗?现在检查我的SP,好吧,很明显@TreeID没有修剪properly@ubaidashrafmasoody检查我的最新答案,告诉我这是否适合你。正如我所说,当我尝试这样做时,它对我来说也很好,但不知何故,SP中的相同代码不起作用!这也是同样的代码块。请发布SP代码,很可能问题不在这部分代码中。您使用的是哪个版本的SqlServer?在SQLServer2008R2中,您的代码运行正常。代码没有问题。错误可能在于您对结果的分析。@TabAlleman我调试了代码,我正确地接收到了值,但在使用替换或修剪函数后,值仍然保持不变!!除了你,它对其他人都有效,所以要么你的SQL server副本有缺陷,要么你做错了什么,但我们无法从你的肩膀看出它是什么。是的,当我单独使用它时,它对我有效,但我不明白为什么它不起作用。现在不幸的是,我没有办法确切地告诉你我是什么
declare @Tree_ID varchar(100)
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
print '|'+@Tree_ID+'|'
CREATE FUNCTION RemovewhiteSpaces
(
@InputStr varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @InputStr
while charindex(' ', @ResultStr) > 0
set @ResultStr = replace(@InputStr, ' ', '')
return @ResultStr
END
select dbo.RemoveAllSpaces('1.23 1 ')
RESULT
1.231
Declare @Tree_ID char(30)
Declare @Tree_ID varchar(30)