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) )
你能提供吗?当我们可以重新创建问题时,可以更容易地提供帮助。您能提供吗?当我们可以重新创建问题时,提供帮助就容易多了。