我有一个名为Split的表值函数。该函数需要2个字符串。它将根据第二个字符串的值将第一个字符串拆分为行。
我想要在'go'语句中拆分sql的函数。问题是当它在sql中的任何地方找到字符串'go'时它会拆分sql字符串。我需要它才能在字符串'go'上拆分,只有它本身就在一条线上。有任何想法吗?我希望不必重新编写该函数,而是以某种方式(希望简单)修改它。
IF EXISTS (SELECT * FROM sys.objects WHERE
type = 'TF' AND name = 'Split')
BEGIN
DROP FUNCTION [dbo].[Split]
END
GO
CREATE FUNCTION dbo.Split
(
@RowData nvarchar(MAX),
@SplitOn nvarchar(50)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data nvarchar(MAX)
)
AS
BEGIN
Declare @Cnt int
DECLARE @tst varchar(MAX)
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Select
@tst = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)));
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+2,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
GO
-- test out the function
SELECT data
FROM dbo.Split('
begin transaction;
go
alter table activity_log add
hcm_got_estimate_num char(16) default (NULL);
go
set ANSI_NULLS on;
go
commit;
go'
, 'go');
答案 0 :(得分:0)
我们的想法是在“拆分”参数中为“go”添加回车符。不幸的是,拆分在这种组合上不能很好地工作(一些工件仍然存在)。因此,为了不搞乱Split功能,您可以通过用一些特殊字符替换回车+'go'来准备文本,然后对该字符进行拆分:
SELECT data
FROM dbo.Split(REPLACE('
begin transaction;
go
alter table activity_log add
hcm_got_estimate_num char(16) default (NULL);
go
set ANSI_NULLS on;
go
commit;
go',char(13) + char(10) + 'go', '¬')
, '¬');