Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
Sql 我可以在这里避免使用游标吗?_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql 我可以在这里避免使用游标吗?

Sql 我可以在这里避免使用游标吗?,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,这是一个起点 CREATE TABLE #Data ( ID INT IDENTITY(1,1), MyData VARCHAR(200) ) INSERT INTO #Data (Data) VALUES ('Test123, Test678') INSERT INTO #Data (Data) VALUES ( 'abcd, efgh, mnop') 我想解析MyData列中以逗号分隔的数据,并将其与相关ID相关联。因此最终结果将是 ID

这是一个起点

CREATE TABLE #Data (  
  ID      INT IDENTITY(1,1),  
  MyData  VARCHAR(200)  
)   

INSERT INTO #Data (Data) VALUES ('Test123, Test678')  
INSERT INTO #Data (Data) VALUES ( 'abcd, efgh, mnop')  
我想解析MyData列中以逗号分隔的数据,并将其与相关ID相关联。因此最终结果将是

ID  ParsedData
--------------
1  Test123  
1  Test678  
2  abcd  
2  efgh  
2  mnop  

我可以通过游标来完成,但我想避免它。有没有更好的方法来编写查询?

您是否愿意更改进程的输入?如果是这样,您可以使用自定义用户定义的表类型

CREATE TYPE [dbo].[SomeInfo] AS TABLE(
[Id] [int] NOT NULL, 
[SomeValue] [int] NOT NULL )
定义存储过程

CREATE PROCEDURE [dbo].[AddSomeStuff]
    @theStuff [SomeInfo] READONLY
AS
BEGIN
    INSERT INTO SOMETABLE ([...columns...])
    SELECT [...columns...] from @theStuff
END
如果需要从.net调用它,则需要创建一个与模式匹配的datatable(下面称为table),并调用存储的过程

var cmd = new SqlCommand("AddSomeStuff", sqlConn) {CommandType = CommandType.StoredProcedure};

var param = new SqlParameter("@theStuff", SqlDbType.Structured) {Value = table};
cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();

在SQLServer2005及更高版本中,您可以避免使用光标,但将这个逗号分隔的字符串拆分为有用的内容将始终是一个迭代过程

有几种方法和存储函数可以拆分字符串并返回值表。使用,您可以编写如下内容:

SELECT 
d.ID, Value
FROM 
#Data AS d
CROSS APPLY
[dbo].[SplitDelimited](d.MyData, ',') 
ID   Value
 1   Test123
 1   Test678
 2   abcd
 2   efgh
 2   mnop
您将得到如下输出:

SELECT 
d.ID, Value
FROM 
#Data AS d
CROSS APPLY
[dbo].[SplitDelimited](d.MyData, ',') 
ID   Value
 1   Test123
 1   Test678
 2   abcd
 2   efgh
 2   mnop

这样做的最佳方式是字符串的长度、分隔符的频率、并发使用、在并行计划中的适用性、结果是否将用于
连接操作,这也是一个问题,也取决于此

下面我链接了Adam Machanic的TSQL split函数,它使用数字表。在上面的链接中有更多的负载


使用这样的函数怎么样


什么程序需要什么输入?我完全不知道你的答案如何帮助解决我提出的问题。你能详细说明一下吗?这个想法是,你不再在一个变量中传递逗号分隔的信息,而是以表结构的形式传递数据,从而避免了整个解析问题;但如果是,我认为它是最干净的。使用
交叉应用
和分割TVF或连接到理货台上。这里的示例并没有将逗号分隔的数据放在sql server列的第一位。你可以做一些更糟糕的事情。@Joel:这是一些外部数据,这就是他们发送给我的方式。@marc_:SQL Server2008@Martin:我查看了链接,但不确定如何在此处应用该链接。我可以得到每个条目的计数,但我只是不知道如何将其与ID关联。如果您可以添加一些特定于此场景的示例,将不胜感激。