【发布时间】:2019-06-08 01:45:39
【问题描述】:
我正在尝试将来自here 的顶级解决方案的最顶层代码转换为 SQL 用户定义函数。但是,当我尝试对数字 4 使用变量时(在 value 函数的第一个参数中),它会出错。
所以这行得通:
SELECT CAST('<x>' + REPLACE(@Input,',','</x><x>') + '</x>' AS XML).value('/x[4]','int')
...但是每当我尝试替换 '/x[4]' 以使用变量代替 4 时,我都会收到类似
的消息XML 数据类型方法“value”的参数 1 必须是字符串字面量。
到目前为止,这是我完整的用户定义函数......只是学习如何:
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
【问题讨论】:
-
你为什么要传递一个叫做“数字”的字符串?
-
您在问题中找到并链接的答案为您提供了解决方案:当然您可以使用变量作为分隔符和位置(使用
sql:column直接从查询值中检索位置):DECLARE @dlmt NVARCHAR(10)=N' '; DECLARE @pos INT = 2; SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')
标签: sql sql-server xml tsql csv