2015-09-10 49 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

这是复杂的过程,但是,这个功能确实的目的。 –

相关问题