2013-04-10 88 views
2

我有一個分隔字符串,它充當目標分隔字符串的關鍵字。我需要知道鍵值序列中的2個值,然後只從目標字符串中提取這些位置。TSQL翻譯CRM 2011中的ChangeData字段

實施例1
鍵:,15,90,104,73,95,13,​​14,
目標:中等〜男〜28〜綠色〜右鍵〜沒有〜10/04/2013

實施例2
鍵:,14,73,104,95,15,13,​​90,
目標:12/03/2013〜綠〜28〜吧〜中〜NO〜男〜

我只關心性別和目標中的日期值和密鑰中的相應條目將始終爲14和90

一旦我知道這些值在哪裏依次出現(示例1中的位置爲2 & 7),我需要拉出我的目標字符串的相同部分,以便我最終得到性別和日期值在其自己的變量中

我已經改變了數據我要找的類型,使問題更容易理解

我希望是有道理的

感謝

馬特

回答

0

嘗試這種解決方案 -

DECLARE @temp TABLE 
(
     id INT IDENTITY(1,1) 
    , k NVARCHAR(100) 
    , t NVARCHAR(500) 
) 

INSERT INTO @temp (k, t) 
VALUES 
    (',15,90,104,73,95,13,14,', 'Medium~Male~28~Green~Right~No~10/04/2013'), 
    (',14,73,104,95,15,13,90,', '12/03/2013~Green~28~Right~Medium~No~Male~') 

SELECT 
     data.id 
    , data.p 
    , data.r 
FROM (
    SELECT 
      p = p.value('(.)[1]', 'NVARCHAR(50)') 
     , po = p.value('for $i in . return count(../*[. << $i])', 'int') 
     , r = r.value('(.)[1]', 'NVARCHAR(50)') 
     , ro = r.value('for $i in . return count(../*[. << $i])', 'int') 
     , d.id 
    FROM (
     SELECT 
       t.id 
      , txml = CAST('<r><s>' + REPLACE(t.k + ',', ',', '</s>' + '<s>') + '</s></r>' AS XML) 
      , kxml = CAST('<r><s>' + REPLACE(t.t + '~', '~', '</s>' + '<s>') + '</s></r>' AS XML) 
     FROM @temp t 
    ) d 
    CROSS APPLY kxml.nodes('/r/s') t(p) 
    CROSS APPLY txml.nodes('/r/s') k(r) 
) data 
WHERE data.po = data.ro - 1 
    AND data.r IN ('14', '90') 
    --AND r + data.p != '' 
ORDER BY data.id 
+0

神奇的幫助! 非常感謝您對此的幫助。 – Powell21 2013-04-10 10:31:57

+0

我不是故意不接受這個解決方案。我想我可以同時接受2個 – Powell21 2013-04-16 13:55:11

0

您可以拆分兩個字符串(請參閱:Split function equivalent in T-SQL?)。

然後,當您將字符串拆分爲兩個表格對象時,可以在第N條記錄(例如,使用TOP關鍵字)訪問這兩個表格,並且可以獲得結果。

給定兩個字符串和一個int,你可以編寫一個函數來獲得兩個耦合值。

+0

The只有該解決方案的問題是每次生成目標和密鑰時,長度可能會發生很大變化,因此無法知道我需要的列數。 我希望能夠將變量的順序值存儲在變量中,然後使用該變量從目標中提取相關部分 – Powell21 2013-04-10 09:39:23

+0

如果我能夠很好地理解您的評論並再次閱讀您的問題,我想一旦您擁有了按照函數的方式將表中的值分解(可變,臨時或物理上無關緊要),您可以獲得該表的第n個記錄。看到這裏:http://stackoverflow.com/questions/1022514/selecting-nth-record-in-an-sql-query – 2013-04-10 10:10:36

+0

但無論我使用的表的類型不會我必須定義一些列?我不知道我需要多少列,因爲我的字符串中的值的數量會改變 – Powell21 2013-04-10 10:16:03

0

作爲一個快速跟進,我不得不將上述溶液(可能是由於我的一個知識的缺乏)的麻煩,所以我創建了以下功能和他們做的工作

GET SEQUENTIAL VALUE ------------------------------------------ ----------------------------

DECLARE @Attributemask varchar(max) = '[PASS IN KEY STRING]' 
DECLARE @Required varchar(10) = '[PASS IN VALUE TO LOOK FOR FOLLOWED BY A COMMA]' 
DECLARE @AttPosition int 
DECLARE @TempString varchar(max) 
DECLARE @Result as int 

SET @AttPosition = CHARINDEX(@Required, @Attributemask) 
SET @TempString = LEFT(@Attributemask, @AttPosition) 
SET @Result = len(@TempString)-len(replace(@TempString,',','')) 
SELECT @Result 

GET DATA ------------- -------------------------- -------------------------------------------

DECLARE @ChangeData varchar(max) = '[PASS IN TARGET STRING]' 
DECLARE @AttPos int = [PASS IN RESULT FROM PREVIOUS FUNCTION] 
DECLARE @Count int = 1 
DECLARE @NotNeeded varchar(100) 
Declare @Result varchar(max) 

SET @ChangeData = '~'[email protected] 

WHILE @Count < (@AttPos +1) 
BEGIN 
    SET @NotNeeded = CHARINDEX('~', @ChangeData) 
    SET @ChangeData = right(@ChangeData,len(@ChangeData) - @NotNeeded) 
    IF len(@ChangeData) = 0 BREAK 
    SET @Count = @Count +1 
END 

SET @Result = LEFT(@ChangeData, (CHARINDEX('~', @ChangeData))) 
SET @Result = LEFT(@Result, (LEN(@Result)-1)) 
Select @Result