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_split或coalesce等.但是如果不使用动态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)