即使在使用适当的功能后也不会删除尾随空格
Trailing spaces not being removed even after using appropriate functions
我只是想从字符串变量中删除尾随 space。
下面是示例代码:
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
但令我惊讶的是,前导 space 没有被删除。我单独做了同样的事情,效果很好。但不知何故,它并没有在我的存储过程中修剪 space。
下面是我的存储过程
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
以下部分代码:
if @CompNo =0
Begin
Set @Tree_ID = Convert(varchar(10),@Company_No) + '.' + @Tree_ID
end
Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
@Tree_ID 在 Set @Tree_ID = Convert(varchar(10),@Company_No) + '.' + @Tree_ID
的值是 1.23,尾随 spaces,所以当我做 Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
但是当我在调试器中添加手表时,它仍然是一样的!!
您可以使用 REPLACE。
SELECT REPLACE(@Tree_ID, ' ', '')
尝试使用这个:
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(@Tree_ID, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
declare @Tree_ID varchar(100)
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
print '|'+@Tree_ID+'|'
结果:|1.23|
它工作得很好,但作为一个建议。请注意选项卡 spaces 或输入 spaces(例如当文本取自备忘录时)
用 TAB 查看这个 ex space :
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
并在您的商店程序中申请...可能会很好
编辑:问题是@Tree_ID 使用数据类型 CHAR(30)!
CHAR 总是填充足够 space 来使用它的全长。如果您不想尾随 space,则需要使用 VARCHAR。
@Tree_ID
是一个 char(30)
。因此,无论您如何 trim 或替换空格,总是 30 个字符。
您可以尝试使用 varchar。 Declare @Tree_ID varchar(30)
伙计们,我替换了下面的代码:
Declare @Tree_ID char(30)
有:
Declare @Tree_ID varchar(30)
它对我来说效果很好。所以,这意味着 LTRIM
、RTRIM
或 Replace
函数都没有问题,它们在静态分配 (char
) 上不起作用,当我将其更改为 varchar
效果很好
我只是想从字符串变量中删除尾随 space。 下面是示例代码:
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
但令我惊讶的是,前导 space 没有被删除。我单独做了同样的事情,效果很好。但不知何故,它并没有在我的存储过程中修剪 space。
下面是我的存储过程
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
以下部分代码:
if @CompNo =0
Begin
Set @Tree_ID = Convert(varchar(10),@Company_No) + '.' + @Tree_ID
end
Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
@Tree_ID 在 Set @Tree_ID = Convert(varchar(10),@Company_No) + '.' + @Tree_ID
的值是 1.23,尾随 spaces,所以当我做 Set @Tree_ID = REPLACE(@Tree_ID, ' ', '')
但是当我在调试器中添加手表时,它仍然是一样的!!
您可以使用 REPLACE。
SELECT REPLACE(@Tree_ID, ' ', '')
尝试使用这个:
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(@Tree_ID, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
declare @Tree_ID varchar(100)
Set @Tree_ID='1.23 '
Set @Tree_ID = LTRIM(RTRIM(@Tree_ID))
print '|'+@Tree_ID+'|'
结果:|1.23|
它工作得很好,但作为一个建议。请注意选项卡 spaces 或输入 spaces(例如当文本取自备忘录时)
用 TAB 查看这个 ex space :
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
并在您的商店程序中申请...可能会很好
编辑:问题是@Tree_ID 使用数据类型 CHAR(30)!
CHAR 总是填充足够 space 来使用它的全长。如果您不想尾随 space,则需要使用 VARCHAR。
@Tree_ID
是一个 char(30)
。因此,无论您如何 trim 或替换空格,总是 30 个字符。
您可以尝试使用 varchar。 Declare @Tree_ID varchar(30)
伙计们,我替换了下面的代码:
Declare @Tree_ID char(30)
有:
Declare @Tree_ID varchar(30)
它对我来说效果很好。所以,这意味着 LTRIM
、RTRIM
或 Replace
函数都没有问题,它们在静态分配 (char
) 上不起作用,当我将其更改为 varchar
效果很好