Я пытаюсь превратить верхний код верхнего решения из здесь в пользовательскую функцию SQL.Однако, когда я пытаюсь использовать переменную для числа 4 (в первом аргументе функции-значения), это barfs.
Так что это работает:
SELECT CAST('<x>' + REPLACE(@Input,',','</x><x>') + '</x>' AS XML).value('/x[4]','int')
... новсякий раз, когда я пытаюсь заменить '/ x [4]', чтобы использовать переменную вместо 4, я получаю сообщение вроде
Аргумент 1 метода типа данных XML "значение" долженбыть строковым литералом.
Вот моя полная пользовательская функция на данный момент ... просто учусь:
USE [DBName]
GO
CREATE FUNCTION fx_SegmentN
(@Input AS VARCHAR(100),
@Number AS VARCHAR(1))
RETURNS varchar(100)
AS
BEGIN
DECLARE @ValueStringLiteral varchar(14)
SET @ValueStringLiteral = '/x[' + @Number + ']'
RETURN '' +
CASE
WHEN @Number <1
THEN ('ERROR')
WHEN @Number = 1
THEN (LEFT(@Input, CHARINDEX('-', @Input, 1)-1))
WHEN @Number > 1
--THEN (SELECT CAST('<x>' + REPLACE(@Input,',','</x><x>') + '</x>' AS XML).value('/x[4]','int')) --THIS LINE WORKS
THEN (SELECT CAST('<x>' + REPLACE(@Input,',','</x><x>') + '</x>' AS XML).value('/x[' + @Number + ']','int')) --THIS ONE DOES NOT
ELSE
(NULL)
END + ''
END