【发布时间】:2015-01-14 21:20:24
【问题描述】:
我试图先在 '_' 上拆分这个字符串 "1,1_5,2_3,4",然后在 ',' 上拆分子字符串,所以它就像 "1,1_5,2_3,4" 拆分-ed on '_' 首先,它会给这个子字符串“1,1”,然后这个子字符串在','上拆分,然后像这样将拆分后的子字符串“1 1”插入到临时表中
INSERT INTO [dbo].[TEST] ([X],[Y])
VALUES (@X,@Y)
我这样做只在一个分隔符','上拆分,就像这样 首先我创建一个表拆分函数
ALTER FUNCTION [dbo].[Split]
(
-- Add the parameters for the function here
@RowData nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data nvarchar(100)
)
AS
BEGIN
-- Declare the return variable here
Declare @Cnt int
Set @cnt = 1
While(charindex(@SplitOn,@RowData) > 0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(RTRIM(SUBSTRING(@RowData,1,CHARINDEX(@SplitOn,@RowData)-1)))
set @RowData = SUBSTRING(@RowData,CHARINDEX(@SplitOn,@RowData)+1,len(@RowData))
set @Cnt = @Cnt + 1
End
insert into @RtnValue(data)
select Data = ltrim(RTRIM(@RowData))
RETURN
END
然后我创建这个存储过程
ALTER PROCEDURE [dbo].[uspTest]
-- Add the parameters for the stored procedure here
@StringOFXIDs nvarchar(2000)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @SOMETABLE TABLE(ID INT IDENTITY(1,1) UNIQUE, XID INT);
DECLARE @XCOUNT INT;
DECLARE @XCURRENT INT;
DECLARE @XCOUNTER INT = 1;
-- Insert statements for procedure here
INSERT INTO @SOMETABLE([XID])
SELECT [Data] FROM [dbo].[Split](@StringOFXIDs,',');
SELECT @XCOUNT = COUNT(1) FROM @SOMETABLE;
WHILE (@XCOUNTER <= @XCOUNT)
BEGIN
SELECT @XCOUNTER = [XID]
FROM @SOMETABLE
WHERE [ID] = @XCOUNTER
INSERT INTO [dbo].[TEST] ([X])
VALUES (@XCOUNTER)
SELECT @XCOUNTER +=1;
END
END
--EXEC [dbo].[uspTest] '1,2,3,4'
然后执行此存储过程,一切正常,但我不知道如何将字符串拆分为两个字符或分隔符,然后插入临时表,感谢您提前提供的任何帮助。
【问题讨论】:
-
您的字符串拆分器是 t-sql 中所有拆分字符串的方式中最慢的。查看这篇文章,了解一些对性能更好的拆分字符串的方法。
-
根据您的 '1,1_5,2_3,4' 示例,您对输出的期望是什么?
标签: sql asp.net sql-server string split