2015-09-10 50 views
2

請幫我編寫存儲過程。在這裏,我有一個像下面給出的輸入。查找「{」和「}」中包含的文本並將其插入表

{local.txt_concept_id} != "" & {local.txt_ICD_code} != "" & 
{local.txt_diagnosis_uniq_id} != "" & {local.txt_ICD_desc} != ""& 
{FIND({local.txt_ICD_code} , "asp", 0)}!=-1& 
{LEN({local.txt_diagnosis_uniq_id})} 

從中我想獲得封閉在打開和關閉大括號內的文本。這必須在SQL Server本身完成。所以沒有高級語言 (C#,Java,PHP)。

請幫我在具有查詢 預期結果表將有一個像

local.txt_concept_id 
local.txt_ICD_code 
local.txt_ICD_desc 
local.txt_diagnosis_uniq_id 
+0

嗨杉雨安東尼,我很好奇:你已經改變了第四或第五也許時間了公認的答案......這是好的,當然......我只是想知道爲什麼。 – Shnugo

回答

2

使用價值這一點:

SqlFiddle

DECLARE @myString NVARCHAR(MAX) = '{local.txt_concept_id} != "" & {local.txt_ICD_code} != "" & 
{local.txt_diagnosis_uniq_id} != "" & {local.txt_ICD_desc} != ""& 
{FIND({local.txt_ICD_code} , "asp", 0)}!=-1& 
{LEN({local.txt_diagnosis_uniq_id})}'; 

SELECT T2.X.value('.', 'varchar(50)') 
FROM 
(SELECT CAST(REPLACE(REPLACE((SELECT @myString FOR XML PATH('')), '{', '<X>'), '}', '</X>') AS XML).query('.')) AS T1(X) 
CROSS APPLY T1.X.nodes('/X/text()') AS T2(X); 

您還可以添加WHERE條件更多的過濾。

+0

它非常接近,我想我可以從這裏得到這個 謝謝 –

+1

我喜歡這個棘手的方法;-) – Shnugo

1

這應該爲你工作...

declare @s VARCHAR(MAX)= 
'{local.txt_concept_id} != "" & {local.txt_ICD_code} != "" & 
{local.txt_diagnosis_uniq_id} != "" & {local.txt_ICD_desc} != ""& 
{FIND({local.txt_ICD_code} , "asp", 0)}!=-1& 
{LEN({local.txt_diagnosis_uniq_id})}'; 

WITH DividedByAmpersand AS 
(
    SELECT CAST('<root><r>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@s,'{LEN(',''),'{FIND(',''),CHAR(10),''),CHAR(13),''),'&','</r><r>') + '</r></root>' AS XML) AsXML 
) 
,TheNodes AS 
(
    SELECT nodes.node.query('.') AS OneNode 
    FROM DividedByAmpersand 
    CROSS APPLY AsXML.nodes('/root/r') AS nodes(node) 
) 
SELECT SUBSTRING(thePart.content,2,CurlyClose.position-2) 
FROM TheNodes 
CROSS APPLY(SELECT LTRIM(RTRIM(TheNodes.OneNode.value('(/r)[1]','varchar(max)')))) AS thePart(content) 
CROSS APPLY(SELECT CHARINDEX('}',thePart.content,1)) AS CurlyClose(position) 
1
DECLARE @myString NVARCHAR(max) = 
'{local.txt_concept_id} != "" FDKJFKJ TRJEHTJH TREKJTJT & {local.txt_ICD_code} != "" & {local.txt_diagnosis_uniq_id} != "" & {local.txt_ICD_desc} != ""& {FIND({local.txt_ICD_code} , "asp", 0)}!=-1& {LEN({local.txt_diagnosis_uniq_id_IN_LENGTH})}' 
; 
DECLARE @i  INT, 
     @start INT, 
     @end INT, 
     @new NVARCHAR(max) 
DECLARE @FieldTable TABLE 
    ( 
    field_name VARCHAR(200) 
) 

WHILE (Len(@myString) > 0) 
    BEGIN 
     SET @new = '' 

     SELECT @start = Patindex('%{%', @mystring), 
      @end = Patindex('%}%', @myString) 

     IF(@end < @start) 
     BEGIN 
      SELECT @myString = RIGHT(@myString, Len(@mystring) - 1) 
     END 
     ELSE IF (Patindex('%}%', @myString) = 0 
      OR Patindex('%{%', @myString) = 0) 
     BEGIN 
      SET @myString = '' 
     END 
     ELSE 
     BEGIN 
      SELECT @new = Substring(@mystring, @start, @end - @start + 1) 
      SELECT @myString = Replace(@mystring, @new, '') 
      SET @new = Reverse(Replace(@new, '}', '')) 
      SET @i = Patindex('%{%', @new) - 1 
      SET @new = Reverse(LEFT(@new, @i)) 
     END 

     IF(Len(@new) > 1 
      AND Patindex('%)%', @new) = 0 
      AND Patindex('%(%', @new) = 0) 
     INSERT INTO @FieldTable 
     VALUES  (@new) 
    END 

SELECT * 
FROM @FieldTable 
+0

這是複雜的過程,但是,這個功能確實的目的。 –

相關問題