您好,感谢您审核我的问题!
在供应商提供的MS SQL数据库中,我们可以通过GUI添加用户定义的字段,该数据库将数据填充为表中的xml字符串。我希望能够运行一个查询,它将剥离XML并留下我之间的数据。
以下是UDF列
中数据的示例<udf><udf_date_induction>2013-11-19</udf_date_induction>
在我的示例中,我想动态删除日期左右的所有内容(这是一个变量)2013-11-19
,这些是常量,可以引用它们。
<udf><udf_date_induction>
和
</udf_date_induction>
答案 0 :(得分:0)
我想这会让你想到工作:
declare @val varchar(100)
set @val='<udf><udf_date_induction>2013-11-19</udf_date_induction>'
start:
if (charindex('<',@val)=1)
begin
set @val=substring(@val,charindex('<',@val)+charindex('>',@val),len(@val))
goto start
end
print substring(@val,0,charindex('<',@val))
答案 1 :(得分:0)
在您的情况下,函数适合获取日期。
您的案例的架构(假设它是您的实际表格)
CREATE TABLE #TAB (DATEINXML VARCHAR(MAX))
INSERT INTO #TAB
SELECT '<udf><udf_date_induction>2013-11-19</udf_date_induction>'
UNION ALL
SELECT '<udf><udf_date_induction>2014-12-20</udf_date_induction>'
UNION ALL
SELECT '<udf><udf_date_induction>2015-01-21</udf_date_induction>'
UNION ALL
SELECT '<udf><udf_date_induction>2016-02-22</udf_date_induction>'
所以表中的数据
+----------------------------------------------------------+
| DATEINXML |
+----------------------------------------------------------+
| <udf><udf_date_induction>2013-11-19</udf_date_induction> |
| <udf><udf_date_induction>2014-12-20</udf_date_induction> |
| <udf><udf_date_induction>2015-01-21</udf_date_induction> |
| <udf><udf_date_induction>2016-02-22</udf_date_induction> |
+----------------------------------------------------------+
现在创建一个User Defined函数,它将接受您的列并从xml部分提供日期。 (我使用了使用Stuff函数的递归CTE)
CREATE FUNCTION [dbo].[FN_GETDATEFROMXML](@VAR VARCHAR(MAX)) RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @DATA VARCHAR(50)
;WITH CTE AS(
SELECT 1 AS START,CHARINDEX('<',@VAR,1 ) FIRST_IND,CHARINDEX('>',@VAR,1 ) SECOND_IND , STUFF(@VAR,CHARINDEX('<',@VAR,1 ),CHARINDEX('>',@VAR,1 ),'') AS DATA
UNION ALL
SELECT CAST(SECOND_IND+1 AS INT),CHARINDEX('<',DATA,1 ) FIRST_IND,CHARINDEX('>',DATA,1 ) SECOND_IND , STUFF(DATA,CHARINDEX('<',DATA,1 ),CHARINDEX('>',DATA,1 ),'') DATA FROM CTE
WHERE CHARINDEX('<',DATA,1 ) <>0
)
SELECT @DATA= DATA FROM CTE WHERE START= (SELECT MAX(START) FROM CTE )
RETURN @DATA
END
现在在表格列上调用此UDF,如下所示
SELECT DATEINXML, DBO.[FN_GETDATEFROMXML](DATEINXML) AS DATE_FROM_XML FROM #TAB
结果将是
+----------------------------------------------------------+---------------+
| DATEINXML | DATE_FROM_XML |
+----------------------------------------------------------+---------------+
| <udf><udf_date_induction>2013-11-19</udf_date_induction> | 2013-11-19 |
| <udf><udf_date_induction>2014-12-20</udf_date_induction> | 2014-12-20 |
| <udf><udf_date_induction>2015-01-21</udf_date_induction> | 2015-01-21 |
| <udf><udf_date_induction>2016-02-22</udf_date_induction> | 2016-02-22 |
+----------------------------------------------------------+---------------+