首页 > 解决方案 > 如何分离变量和值,然后插入表中?

问题描述

问题

存储过程正在接收变量和值的列表以及分隔符。此存储过程需要将它们插入到表中。

--Example table
create table #tempo
(
    Variable1 int,
    Variable2 int,
    Variable3 int
)

这些是存储过程的参数:

declare @variableList varchar(100)
declare @valueList varchar(100)
declare @separator char(1)

set @variableList = 'Variable1#Variable2#Variable3'
set @valueList = '1111#2222#3333'
set @separator = '#'

结果

我想要实现的是:

select * from #tempo

+---------+---------+---------+
|Variable1|Variable2|Variable3|
+---------+---------+---------+
|1111     |2222     |3333     |
+---------+---------+---------+

一种方法

我可以使用循环并构建动态 SQL,但我想避免它。除了不使用动态 SQL 的明显原因之外,循环结构难以维护、解释和测试也可能成为问题。

理想方式

我正在考虑一种更优雅的方法来做到这一点,例如使用string_splitcoalesce等。但是如果不使用动态 SQL 或循环就无法找到一种方法。

标签: sql-serverloopstsqlsql-server-2016dynamic-sql

解决方案


如果您总是有相同的列名集,那么使用透视很容易,但如果列正在更改,那么您可以使用具有动态调整的变量列表的相同脚本,作为参数提供或从临时表中直接读取:

INSERT INTO #tempo SELECT *
FROM (
    SELECT [value], rv = 'Variable' + CAST(Row_Number() OVER ( ORDER BY (SELECT 1)) as VARCHAR)
    FROM STRING_SPLIT(@valueList,@separator)
) AS src
PIVOT (MAX([value]) FOR rv IN (Variable1,Variable2,Variable3)) AS pvt;

推荐阅读