Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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_Sql Server 2008 - Fatal编程技术网

使用sql在表中插入两个或多个逗号分隔的值

使用sql在表中插入两个或多个逗号分隔的值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想尝试在表中插入两个变量。值用逗号分隔,但我不知道如何插入它 我的情况如下 我创建临时表 create table #temp (sku varchar(10), qty int) 现在用值声明两个变量 declare @sku varchar(200) = 'RCLET0005,RCLET0015'; declare @qty varchar(100) = '2,1'; 现在我想在#temp表中插入这个变量 我有分裂功能。 我试着在下面提问 insert into #temp (sku,

我想尝试在表中插入两个变量。值用逗号分隔,但我不知道如何插入它

我的情况如下

我创建临时表

create table #temp (sku varchar(10), qty int)
现在用值声明两个变量

declare @sku varchar(200) = 'RCLET0005,RCLET0015';
declare @qty varchar(100) = '2,1';
现在我想在#temp表中插入这个变量 我有分裂功能。 我试着在下面提问

insert into #temp (sku,qty) values
((select value from [dbo].[fn_Split](@sku, ',')),
(select value from [dbo].[fn_Split](@qty, ',')))

你可以这样做

WITH cte AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY null) as rn, value FROM [dbo].[fn_Split](@sku, ',')
    UNION
    SELECT 2+(row_number() OVER(ORDER BY null)) as rn, value FROM [dbo].[fn_Split](@qty, ',')
)

INSERT INTO #temp
SELECT c1.value,c2.value
FROM cte c1 
    INNER JOIN cte c2 ON c2.rn = c1.rn+1 AND c1.rn IN (1,3) AND c2.rn IN (2,4)

fn_Split函数需要返回每个值的顺序位置,以便可以关联单独的列表。下面是使用派生表子查询的示例。您也可以使用CTE或交叉应用

INSERT INTO #temp (sku,qty) 
SELECT 
      sku.value
    , qty.value
FROM (SELECT ordinal_position, value FROM [dbo].[fn_Split](@sku, ',') AS sku
JOIN (SELECT ordinal_position, value FROM [dbo].[fn_Split](@qty, ',') AS qty ON
    sku.ordinal_position = qty.ordinal_position;

假设值在每个字符串中不重复,并且分割函数不返回位置,则可以执行以下操作:

with s as (
      select value,
             row_number() over (order by (select null)) as pos
      from dbo.fn_Split(@sku, ',')
     ),
     q as (
      select value,
             row_number() over (order by (select null)) as pos
      from dbo.fn_Split(@qty, ',')
     )
insert into #temp (sku,qty)
    select s.value, q.value
    from s join
         q
         on s.pos = q.pos;
以下CTE可能在没有这些假设的情况下工作——但由于排序不稳定,代码不能保证工作:


替代解决方案不使用
fn\u split()
。他们会使用递归CTE或XML。

拆分函数的输出是什么?
with s as (
      select value,
             row_number() over (order by charindex(value, @sku)) as pos
      from dbo.fn_Split(@sku, ',')
     ),
     q as (
      select value,
             row_number() over (order by charindex(value, @qty)) as pos
      from dbo.fn_Split(@qty, ',')
     )