我将列中的ID列表固定为CSV字符串值('1;2;3')
。
我想用更好的方法进行优化(我相信)会使用varbinary(max)。
我正在寻找tsql函数
1。这会将一组整数行并排合并到varbinary(max)中
2。这会将varbinary字段拆分为一组int行
任何提示表示赞赏,谢谢
答案 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个数字。
不要对每行有百万条记录和百万条数字的数据集运行此功能。