在SQL查询中选择两个常量字符串之间的变量

时间:2016-11-21 05:12:37

标签: sql sql-server

您好,感谢您审核我的问题!

在供应商提供的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>

2 个答案:

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