2016-11-21 60 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 | 
    +----------------------------------------------------------+---------------+ 
相關問題