sql-server - 如何分离变量和值,然后插入表中?
问题描述
问题
存储过程正在接收变量和值的列表以及分隔符。此存储过程需要将它们插入到表中。
--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_split或coalesce等。但是如果不使用动态 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;
推荐阅读
- python - 如何绘制与 plt.contourf 的决策边界相同的决策边界线?
- google-sheets - 列出或自动完成现有字符串值,用于新的纯文本单元格
- java - 在centos中,当Tomcat 7关闭时,就发生了这很可能造成内存泄漏。不知道为什么
- react-native - Metro bundler 将生成的 Bundle 存储在哪里?
- c# - 使用服务参考的肥皂请求
- node.js - 选择一个文件,然后使用 Nodemailer 将其作为附件发送!节点
- java - 如何将数据(参考 ID)从 1 个 txt 文件划分为 5 个 txt 文件,每个文件中的数据应该不同
- angular - Angular 6 - 基于firestore节点值的Route Guard
- android - 我已经从清单中删除了呼叫和短信权限,但在上传 apk 时仍然出现错误
- c++ - 从强制转换的 std::shared_ptr 创建对象实例