Sql server SQL Server-使用列表参数作为后续insert语句的列

Sql server SQL Server-使用列表参数作为后续insert语句的列,sql-server,Sql Server,我正在尝试构造以下查询: delete from product where product_id = 'some_id' and supplier_id IN ('some_id1', 'some_id2') insert into product (product_id, is_active, supplier_id) select 'some_id' as product_id, 1 as is_active, newidst.new_ids as supplier_id from (s

我正在尝试构造以下查询:

delete from product where product_id = 'some_id'
and supplier_id IN ('some_id1', 'some_id2')

insert into product (product_id, is_active, supplier_id)
select 'some_id' as product_id, 1 as is_active, newidst.new_ids as supplier_id
from (select ('new_id1,new_id2') as new_ids) from newidst
我希望删除0行,插入2行。 但我只插了1个字

我的预期输出将是以下两行

some_id, 1, new_id1
some_id, 1, new id2
我能理解的是,它将“new_id1,new_id2”作为一列,而不是两个不同的值,用逗号分隔,。我不知道如何在不创建临时表的情况下执行此操作,我不想创建临时表。使用UNIONALL将是一个挑战,因为在某些情况下,这些新的id列表可能相当长。这里的挑战是,我试图在不重写太多的情况下更新遗留查询

感谢您的任何帮助或建议。

您可以使用union all

from (
          select 'new_id1' as new_ids union all
          select 'new_id2' as new_ids
     ) from newidst
或者使用返回列表的拆分函数

您可以使用union all

from (
          select 'new_id1' as new_ids union all
          select 'new_id2' as new_ids
     ) from newidst

或者使用一个split函数返回一个列表

,如果您有这样一个字符串,您可以将其拆分并插入。以下是插入的示例:

DECLARE @ids NVARCHAR(4000) = 'new_id1,new_id2'
DECLARE @delimiter VARCHAR(50) = ','



insert into product (product_id, is_active, supplier_id)
  SELECT 'some_id' AS productid, '1' AS active, y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@ids, @delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
对于您的删除,它类似于:

  delete from product where product_id = 'some_id'
    and supplier_id IN (  SELECT   y.i.value('(./text())[1]', 'nvarchar(4000)')
          FROM 
          ( 
            SELECT x = CONVERT(XML, '<i>' 
              + REPLACE(@ids, @delimiter, '</i><i>') 
              + '</i>').query('.')
          ) AS a CROSS APPLY x.nodes('i') AS y(i) )

如果您有一个这样的字符串,您可以拆分它并进行插入。以下是插入的示例:

DECLARE @ids NVARCHAR(4000) = 'new_id1,new_id2'
DECLARE @delimiter VARCHAR(50) = ','



insert into product (product_id, is_active, supplier_id)
  SELECT 'some_id' AS productid, '1' AS active, y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@ids, @delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
对于您的删除,它类似于:

  delete from product where product_id = 'some_id'
    and supplier_id IN (  SELECT   y.i.value('(./text())[1]', 'nvarchar(4000)')
          FROM 
          ( 
            SELECT x = CONVERT(XML, '<i>' 
              + REPLACE(@ids, @delimiter, '</i><i>') 
              + '</i>').query('.')
          ) AS a CROSS APPLY x.nodes('i') AS y(i) )
你能提供吗?当我们可以重新创建问题时,可以更容易地提供帮助。您能提供吗?当我们可以重新创建问题时,提供帮助就容易多了。