如何将varbinary(max)拆分为一个int列表? (和另一种方式)

时间:2016-08-05 09:06:58

标签: sql-server tsql

我将列中的ID列表固定为CSV字符串值('1;2;3')

我想用更好的方法进行优化(我相信)会使用varbinary(max)。

我正在寻找tsql函数
1。这会将一组整数行并排合并到varbinary(max)中 2。这会将varbinary字段拆分为一组int行

任何提示表示赞赏,谢谢

1 个答案:

答案 0 :(得分:0)

解决方案非常值得怀疑。我还建议将数据标准化。
但是,如果您仍希望将数据存储为VARBINARY,则可以使用以下解决方案:

CREATE FUNCTION dbo.fn_String_to_Varbinary(@Input VARCHAR(MAX))
RETURNS VARBINARY(MAX) AS
BEGIN
DECLARE @VB VARBINARY(MAX);
WITH CTE as (
    SELECT CAST(CAST(LEFT(IT,CHARINDEX(';',IT)-1) AS INT) as VARBINARY(MAX)) as VB, RIGHT(IT,LEN(IT) - CHARINDEX(';',IT)) AS IT
    FROM (VALUES (@Input)) as X(IT) union all
    SELECT VB + CAST(CAST(LEFT(IT,CHARINDEX(';',IT)-1) AS INT) as VARBINARY(MAX)) as VB, RIGHT(IT,LEN(IT) - CHARINDEX(';',IT)) AS IT FROM CTE WHERE LEN(IT) > 1
)
SELECT TOP 1 @VB = VB FROM CTE
ORDER BY LEN(VB) DESC
RETURN @VB
END 
GO
DECLARE @Input VARCHAR(MAX) = '421;1;2;3;5000;576;842;375;34654322;18;67;000001;1232142334;'
DECLARE @Position INT = 9
DECLARE @VB VARBINARY(MAX)
SELECT @VB = dbo.fn_String_to_Varbinary(@Input)
SELECT @VB, CAST(SUBSTRING(@VB,4*(@Position-1)+1,4) AS INT)
GO

该函数将字符串转换为VARBINARY,然后脚本从该VARBINARY值中提取第9个数字。

不要对每行有百万条记录和百万条数字的数据集运行此功能。