Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 插入函数返回的行的游标替代方法?_Asp.net_Sql_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

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#', '#')