2017-12-28 28 views
0

SQL Server의 테이블에서 가져온 값으로 대체합니다 문자열
1 선택 * 직원에서 ID BETWEEN ### 및 ### 및 고객 ID> ### 2 고객 *에서 ID BETWEEN ### 및 ### 을 선택하십시오. 여기서 Department를 선택하십시오. 여기서 Id = ###어떻게</p> <pre><code>Create Table StructureStrings(Id INT Primary Key,String nvarchar(4000)) </code></pre> <p><strong>샘플 데이터</strong>을 문자열에 특정 문자를 찾아 내가 텍스트 테이블 "StructureStrings"에 저장 한

,

와 나는 같은 문자열에서 "###"토큰 선물을 대체 할 명 "StructureValues"다른 테이블에서 가져온 가치관과

Create Table StructureValues (Id INT Primary Key,Value nvarcrhar(255)) 
     Id Value 
     1 33 
     2 20 
     3 44 

을 "###"단어를 대체 할

 Select * from Employee where Id BETWEEN 33 and 20 and Customer Id> 44 
     Select * from Customer where Id BETWEEN 33 and 20 
     Select * from Department where Id=33 

PS : 1. 여기서 가정이 값은 "###"의 선두로부터 즉, 동일한 순서로 토큰으로 대체됨을 "StructureValues.Value"의 처음 값으로 대체 될 것이다 열 등등. 여기

+0

우리는 안전하게 **'nvarchar (40000)'이'nvarchar (4000)'라고 가정 할 수 있습니까? 'nvarchar (40000)'은 유효하지 않은 데이터 유형입니다. – Larnu

+0

@Larnu 예, 사실 4000입니다. 감사합니다. 질문을 편집했습니다. –

+0

최신 편집으로 이것은 불가능합니다. 적어도 성능은 끔찍할 것입니다. 특히 대체 문자열' '###' '을 사용하면 매개 변수가 불확실하고 ** 모든 ** 데이터 유형이 될 수 있습니다. 당신은 심각하게 당신의 설정을 재고해야합니다.이드들 사이에도 관계가없는 것 같습니다. 'Select * from Employee from'% ### % ''와 같은 이름이 'Select * from Employee'로 바뀌지 않는 한, '% 44 %'와 같은 이름 (어떤 직원이 ..에 숫자가있는 이름을 가지게됩니까? 그렇다면 Id 4의 문자열 값은 무엇입니까? – Larnu

답변

1

이전 글을 편집하는 대신 새로운 답변으로 게시하십시오.

여기에는 Jeff Moden's DelimitedSplit8K; 항목 번호를 제공하지 않으므로 SQL Server 2016에서 사용할 수있는 기본 제공 스플리터는 사용하지 않습니다 (따라서 조인 기준 없음).

먼저 서버에 기능을 추가해야합니다. 그러면이 기능을 사용할 수 있습니다. 그것이 잘 수행되기를 기대하지 마십시오. 이에 REPLACE이 많이 발생하여 실적을 저해 할 수 있습니다.

SELECT (SELECT REPLACE(DS.Item, '###', CONVERT(nvarchar(100), SV.[Value])) 
     FROM StructureStrings sq 
      CROSS APPLY DelimitedSplit8K (REPLACE(sq.String,'###','###|'), '|') DS --NOTE this uses a varchar, not an nvarchar, you may need to change this if you really have Unicode characters 
      JOIN StructureValues SV ON DS.ItemNumber = SV.Id 
     WHERE SS.Id = sq.id 
     FOR XML PATH ('')) AS NewString 
FROM StructureStrings SS; 

질문이 있으시면이 답변에 대한 의견을 말하십시오. 이미 꽤 긴 토론이 된 질문에 그들을 두지 마십시오.

+0

이것은 정확히 내가 원했던 것입니다. Larnu에게 감사드립니다. –

+0

이 솔루션을 구현했지만 어떻게 든 AND 연산자가 생략됩니다. 예 : CATEGORY_ID = 1 인 SELECT * FROM UAA_AUDIT_DETAILS 위치 및 TIME_STAMP # 23 : 00 # 04 : 00 –

0

매우 다른 의견 :

CREATE TABLE StructureStrings(Id int PRIMARY KEY,String nvarchar(4000)); 

INSERT INTO StructureStrings 
VALUES (1,'SELECT * FROM Employee WHERE Id BETWEEN ### AND ###'), 
     (2,'SELECT * FROM Customer WHERE Id BETWEEN ### AND ###'); 

CREATE TABLE StructureValues (Id int, [Value] int); 
INSERT INTO StructureValues 
VALUES (1,10), 
     (2,20); 
GO 

DECLARE @SQL nvarchar(4000); 
--I'm asuming that as you gave one output you are supplying an ID or something? 
DECLARE @Id int = 1; 

WITH CTE AS(
    SELECT SS.Id, 
      SS.String, 
      SV.[Value], 
      LEAD([Value]) OVER (ORDER BY SV.Id) AS NextValue, 
      STUFF(SS.String,PATINDEX('%###%',SS.String),3,CONVERT(varchar(10),[Value])) AS ReplacedString 
    FROM StructureStrings SS 
     JOIN StructureValues SV ON SS.Id = SV.Id) 
SELECT @SQL = STUFF(ReplacedString,PATINDEX('%###%',ReplacedString),3,CONVERT(varchar(10),NextValue)) 
FROM CTE 
WHERE Id = @Id; 

PRINT @SQL; 
--EXEC (@SQL); --yes, I should really be using sp_executesql 

GO 
DROP TABLE StructureValues; 
DROP TABLE StructureStrings; 

편집 : LEAD에에 값이없는 한, NULL가 반환 ID 2를합니다. 이 값을 변경해야하는 경우 LEAD 값을 입력하지 않으면 값이 무엇인지에 대한 더 많은 논리가 필요합니다.

편집 2 : 이것은 OP의 원래 게시물을 기반으로 한 것이므로 나중에 넣은 것이 아닙니다. 현재 서 있기 때문에 불가능합니다.

0

어쩌면 이것이 당신이 찾고있는 것일 수 있습니다.

DECLARE @Employee TABLE (Id int) 
DECLARE @StructureValues TABLE (Id int, Value int) 

INSERT INTO @Employee 
VALUES (1), (2), (3), (10), (15), (20), (21) 

INSERT INTO @StructureValues 
VALUES (1, 10), (2, 20) 

SELECT * 
FROM @Employee 
WHERE Id BETWEEN (SELECT MIN(Value) FROM @StructureValues) AND (SELECT MAX(Value) FROM @StructureValues) 
+0

@SiddharthBharadwaj이 부분이 정확하지 않으면 정확한 입력 내용을 말해주십시오 그리고 당신이 원하는 정확한 출력. 현재 당신이 찾고있는 것이 정확히 명확하지 않기 때문입니다. – Danieboy