Asp.net 插入函数返回的行的游标替代方法?
我正在向数据库发送一个由一个系列Asp.net 插入函数返回的行的游标替代方法?,asp.net,sql,sql-server,sql-server-2008,sql-server-2005,Asp.net,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我正在向数据库发送一个由一个系列Tax Value对组成的串联字符串,以进行拆分,然后插入到表的两列中。我已经有了一个使用游标的方法,但我想知道在这种情况下是否有更好的替代游标的方法 我的字符串如下:VAT | 10 | CST | 20 | ST | 30 | VAT | 40 | WCT | 50 | OCT | 60 | FP | 70 | CD | 80 | OT | 90 | 税和价值用|分隔,行用#分隔 我使用函数拆分此字符串: 例如: 它返回9行,第一个单元格由identity s
Tax Value
对组成的串联字符串,以进行拆分,然后插入到表的两列中。我已经有了一个使用游标的方法,但我想知道在这种情况下是否有更好的替代游标的方法
我的字符串如下:VAT | 10 | CST | 20 | ST | 30 | VAT | 40 | WCT | 50 | OCT | 60 | FP | 70 | CD | 80 | OT | 90 |
税和价值用|
分隔,行用#
分隔
我使用函数拆分此字符串:
例如:
它返回9行,第一个单元格由identity srno
组成,第二个单元格由tax|value
Create FUNCTION [dbo].[ISplit](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (SrNo int identity, Items nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
SELECT @INDEX = 1
IF @String IS NULL RETURN
WHILE @INDEX !=0
BEGIN
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
INSERT INTO @Results(Items) VALUES(@SLICE)
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
select * into #temp from split('VAT|10#CST|20#ST|30#VAT|40#WCT|50#OCT|60#FP|70#CD|80#OT|90#','#')
DECLARE @row varchar(20)
DECLARE @Temp CURSOR
SET @Temp = CURSOR FOR
SELECT *
FROM #temp
OPEN @Temp
FETCH NEXT
FROM @Temp INTO @row
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @row
select * into #temp1 from iSplit(@row,'|')
declare @tax varchar(10)
declare @value varchar(10)
select @tax= items from #temp1 where srno=1
select @value= items from #temp1 where srno=2
insert into sometable (tax,value) values(@tax,@value)
FETCH NEXT
FROM @Temp INTO @row
END
CLOSE @Temp
DEALLOCATE @Temp
我计划将连接的字符串拆分为#temp表,然后使用光标再次拆分它并将其存储在#temp1表中,然后使用这个#temp1插入两列值,即Tax和Value<代码>插入到sometable(税,值)值(@tax,@value)
在这种情况下,是否有游标或for语句的替代方案 这是你需要的吗
在不改变功能的情况下:
INSERT INTO sometable
(tax,
value)
SELECT Substring(items, 0, Charindex('|', items, 0)) AS tax,
Substring(items, Charindex('|', items, 0) + 1, Len(items)) AS value
FROM [Isplit]('VAT|10#CST|20#ST|30#VAT|40#WCT|50#OCT|60#FP|70#CD|80#OT|90#', '#')
更改功能:
ALTER FUNCTION [dbo].[ISplit](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (SrNo int identity, tax nvarchar(4000),value numeric(22,6))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
SELECT @INDEX = 1
IF @String IS NULL RETURN
WHILE @INDEX !=0
BEGIN
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
INSERT INTO @Results(tax,value)
select Substring(@SLICE, 0, Charindex('|', @SLICE, 0)),
Substring(@SLICE, Charindex('|', @SLICE, 0) + 1, Len(@SLICE)) AS value
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
INSERT INTO sometable
(tax,
value)
SELECT tax,value from Isplit('VAT|10#CST|20#ST|30#VAT|40#WCT|50#OCT|60#FP|70#CD|80#OT|90#', '#')
我正在寻找替代光标和循环的方法。如果有的话。如果我没有弄错你的期望,我上面的答案是一个直截了当的答案。只需要这个函数。没有别的了。你的查询工作正常。但我想知道哪一个更快?是否更快如果没有更好的选择,我会很快标记您的答案。另一个想法>您可以避免使用函数,直接使用while循环。最后,您需要在某个地方使用一个kind循环来解析字符串操作
ALTER FUNCTION [dbo].[ISplit](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (SrNo int identity, tax nvarchar(4000),value numeric(22,6))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
SELECT @INDEX = 1
IF @String IS NULL RETURN
WHILE @INDEX !=0
BEGIN
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
INSERT INTO @Results(tax,value)
select Substring(@SLICE, 0, Charindex('|', @SLICE, 0)),
Substring(@SLICE, Charindex('|', @SLICE, 0) + 1, Len(@SLICE)) AS value
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
INSERT INTO sometable
(tax,
value)
SELECT tax,value from Isplit('VAT|10#CST|20#ST|30#VAT|40#WCT|50#OCT|60#FP|70#CD|80#OT|90#', '#')