2016-11-21 72 views
0

您好,并感谢您审查我的问题!在SQL查询中选择两个常量字符串之间的变量

在供应商提供的MS SQL数据库中,我们可以通过GUI添加用户定义的字段,该GUI将数据填充为表中的xml字符串。我希望能够运行一个查询,将剥离XML并留下我之间的数据。

这是我想要动态地去除一切左右日期的(这是一个变量)2013-11-19在UDF列

<udf><udf_date_induction>2013-11-19</udf_date_induction> 

数据在我的例子的例子,这些都是常量,它是可以引用它们。

<udf><udf_date_induction> 

</udf_date_induction> 
+0

你是什么版本的SQL使用,并且'UDF'列中的每个条目_always_都具有相同的确切XML标签吗? –

回答

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)) 
+0

感谢您的回应,但我无法设置2013年7月19日的@val,它的变量 –

+0

仅从存储信息的表中提取值,并通过游标运行上述查询并使用新值更新表。我只是想知道如何做到这一点:) –

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> | 
    +----------------------------------------------------------+ 

现在创建一个用户自定义函数将接受您的专栏,并给予来自xml部分的日期。 (我用递归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 | 
    +----------------------------------------------------------+---------------+