首页 > 解决方案 > SQL Server - 具有未知数量的多个值的参数

问题描述

我正在创建一个包含两列的网格:NameHotelId. 问题是该网格的数据应该使用单个参数发送,VARCHAR type并且应该如下所示:

@Parameter = 'Name1:5;Name2:10;Name3:6'

如您所见,该参数包含名称和一个表示 ID 值的数字,您可以有多个此类条目,以“ ; ”符号分隔。

我的第一个想法是编写一个查询,创建一个temp table有两列的查询,并用参数中的数据填充它。

我怎么能做到这一点?似乎我需要将参数拆分两次:每行使用“ ; ”符号,然后每列使用“ : ”符号。我应该如何处理这个?

另外,如果有任何其他更合适的解决方案,我愿意接受建议。

标签: sql-serverreporting-services

解决方案


如果存在,首先删除#temp 表...

IF OBJECT_ID('tempdb..#temp', 'U') IS NOT NULL
/*Then it exists*/
DROP TABLE #temp

然后创建#temp table

CREATE TABLE #temp (v1 VARCHAR(100))

宣布所有@Paramter....

DECLARE @Parameter VARCHAR(50)
SET @Parameter= 'Name1:5;Name2:10;Name3:6'
DECLARE @delimiter nvarchar(1) 
SET @delimiter= N';';

在这里,使用 ' 将所有@parameter值插入 #temp 表'分开..

INSERT INTO #temp(v1)
SELECT * FROM(

SELECT v1 = LTRIM(RTRIM(vals.node.value('(./text())[1]', 'nvarchar(4000)')))
FROM (
    SELECT x = CAST('<root><data>' + REPLACE(@Parameter, @delimiter, '</data><data>') + '</data></root>' AS XML).query('.')
) v
CROSS APPLY x.nodes('/root/data') vals(node)
)abc

将值插入表后#temp..将所有值放入' '分隔...

select  Left(v1, CHARINDEX(':', v1)-1) as Name , STUFF(v1, 1, CHARINDEX(':', v1), '') as HotelId FROM #temp

然后你会得到这种类型的输出

在此处输入图像描述


推荐阅读