如何分离变量和值,然后插入表中?

Far*_*han 5 t-sql sql-server loops dynamic-sql sql-server-2016

问题

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

--Example table
create table #tempo
(
    Variable1 int,
    Variable2 int,
    Variable3 int
)
Run Code Online (Sandbox Code Playgroud)

这些是存储过程的参数:

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

set @variableList = 'Variable1#Variable2#Variable3'
set @valueList = '1111#2222#3333'
set @separator = '#'
Run Code Online (Sandbox Code Playgroud)

结果

我想要实现的是:

select * from #tempo

+---------+---------+---------+
|Variable1|Variable2|Variable3|
+---------+---------+---------+
|1111     |2222     |3333     |
+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

一种方法

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

理想的方式

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

小智 1

如果您始终具有相同的列名集,那么使用旋转非常容易,但如果列发生变化,那么您可以使用相同的脚本和动态调整的变量列表,作为参数提供或从临时表直接读取:

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;
Run Code Online (Sandbox Code Playgroud)