2009-11-03 12 views
40

मेरे डेटा लग रहा हैएसक्यूएल सर्वर की जगह, कुछ चरित्र के बाद सभी को निकालने के

ID MyText 
1  some text; some more text 
2  text again; even more text 

मैं सेमी-कोलन के बाद सब कुछ और अर्द्ध बृहदान्त्र सहित ड्रॉप करने MyText अद्यतन कर सकते हैं कैसे, तो मैं निम्नलिखित के साथ छोड़ दिया हूँ की तरह :

ID MyText 
1  some text 
2  text again 

मैं SQL Server Replace को देखा है, लेकिन के लिए जाँच के एक व्यावहारिक तरीका नहीं सोच सकते हैं ","

उत्तर

80

उपयोग वाम CHARINDEX के साथ संयुक्त:

UPDATE MyTable 
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 

ध्यान दें कि कहां खंड पंक्तियों को अद्यतन करने में कोई अर्धविराम है वहाँ छोड़ देता है।

declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) 
insert into @MyTable ([id], MyText) 
select 1, 'some text; some more text' 
union all select 2, 'text again; even more text' 
union all select 3, 'text without a semicolon' 
union all select 4, null -- test NULLs 
union all select 5, '' -- test empty string 
union all select 6, 'test 3 semicolons; second part; third part;' 
union all select 7, ';' -- test semicolon by itself  

UPDATE @MyTable 
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 

select * from @MyTable 

मैं निम्नलिखित परिणाम प्राप्त:

यहाँ काम करता है ऊपर एसक्यूएल सत्यापित करने के लिए कुछ कोड है कुछ क्षेत्रों है जब

id MyText 
-- ------------------------- 
1 some text 
2 text again 
3 text without a semicolon 
4 NULL 
5  (empty string) 
6 test 3 semicolons 
7  (empty string) 
+1

क्या होगा यदि MyText में ';' नहीं है चरित्र? उस स्थिति में, आप बाएं() में दूसरे पैरामीटर के रूप में नकारात्मक 1 का उपयोग नहीं करेंगे। उस स्थिति में, मेरे बॉक्स पर, मुझे "अमान्य लंबाई पैरामीटर को पार करने वाले अमान्य लंबाई पैरामीटर" की त्रुटि मिलती है। – Mike

+0

@ माइक यह बिल्कुल मेरी समस्या है - @najmeddine से अगला उत्तर देखें !! –

+1

@ माइक रशिलियन की प्रतिक्रिया नीचे हल करती है: LEFT (MyText + ';', CHARINDEX (';', MyText + ';') - 1) – Tim

3

";" ढूंढने के लिए CHARINDEX का उपयोग करें। फिर ";" से पहले भाग वापस करने के लिए SUBSTRING का उपयोग करें।

2
UPDATE MyTable 
    SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1) 
WHERE CHARINDEX(';', MyText) > 0 
+0

बस इस की कोशिश की, इसे छोड़ लगता है, अतं मै। ;) – Jimmy

16

समय के लिए एक "," और कुछ आप क्षेत्र में अर्ध-कोलन भी जोड़ सकते हैं और वर्णित उसी विधि का उपयोग नहीं कर सकते हैं।

SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1) 
8

CASE WHEN का उपयोग कर सकते हैं ताकि उन्हें ';' अकेला।

SELECT 
    CASE WHEN CHARINDEX(';', MyText) > 0 THEN 
    LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE 
    MyText END 
    FROM MyTable 
1

स्थितियों के लिए जब मैं बदलने के लिए या मैच (लगता है) स्ट्रिंग के खिलाफ कुछ मैं नियमित अभिव्यक्ति का उपयोग कर पसंद करते हैं की जरूरत है।

चूंकि, नियमित अभिव्यक्ति T-SQL में पूरी तरह से समर्थित नहीं हैं, आप CLR फ़ंक्शंस का उपयोग करके उन्हें लागू कर सकते हैं। इसके अलावा, आपको किसी भी C# या CLR ज्ञान की आवश्यकता नहीं है, जैसा कि आपको केवल एमएसडीएन String Utility Functions Sample में उपलब्ध है।

आपके मामले में, नियमित अभिव्यक्ति का उपयोग कर समाधान है:

SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '') 
FROM [dbo].[MyTable] 

लेकिन अपने डेटाबेस में इस तरह के समारोह को लागू करने आप सब पर और अधिक जटिल मुद्दों को सुलझाने में मदद करने के लिए जा रहा है।


नीचे उदाहरण दिखाता है कि केवल [dbo].[RegexReplace] समारोह तैनात करने के लिए है, लेकिन मैं पूरी String Utility वर्ग तैनात करने के लिए आप के लिए सिफारिश करेंगे।

  1. सीएलआर एकीकरण को सक्षम करना। निष्पादित निम्न Transact SQL आदेश:

    sp_configure 'clr enabled', 1 
    GO 
    RECONFIGURE 
    GO 
    
  2. कोड Bulding (या .dll बनाने)। जेनरली, आप विजुअल स्टूडियो या इसका उपयोग कर ऐसा कर सकते हैं।नेट फ्रेमवर्क कमांड प्रॉम्प्ट (जैसा कि यह आलेख में दिखाया गया है), लेकिन मैं विजुअल स्टूडियो का उपयोग करना पसंद करता हूं।

    • नया वर्ग पुस्तकालय परियोजना बनाने:

      enter image description here

    • कॉपी और Class1.cs फ़ाइल में निम्न कोड चिपकाएँ:

      using System; 
      using System.IO; 
      using System.Data.SqlTypes; 
      using System.Text.RegularExpressions; 
      using Microsoft.SqlServer.Server; 
      
      public sealed class RegularExpression 
      { 
          public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) 
          { 
           string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; 
           string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; 
           string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; 
           return Regex.Replace(input, pattern, replacement); 
          } 
      } 
      
    • समाधान का निर्माण और के लिए पथ प्राप्त बनाई गई .dll फ़ाइल:

      enter image description here

    • निम्नलिखित T-SQL बयान में .dll फ़ाइल का पथ को बदलने के लिए और उन्हें निष्पादित करें:

      IF OBJECT_ID(N'RegexReplace', N'FS') is not null 
      DROP Function RegexReplace; 
      GO 
      
      IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'StringUtils') 
      DROP ASSEMBLY StringUtils; 
      GO 
      
      DECLARE @SamplePath nvarchar(1024) 
      -- You will need to modify the value of the this variable if you have installed the sample someplace other than the default location. 
      Set @SamplePath = 'C:\Users\gotqn\Desktop\StringUtils\StringUtils\StringUtils\bin\Debug\' 
      CREATE ASSEMBLY [StringUtils] 
      FROM @SamplePath + 'StringUtils.dll' 
      WITH permission_set = Safe; 
      GO 
      
      
      CREATE FUNCTION [RegexReplace] (@input nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max)) 
      RETURNS nvarchar(max) 
      AS EXTERNAL NAME [StringUtils].[RegularExpression].[Replace] 
      GO 
      
    • यह है कि। अपने कार्य का परीक्षण करें:

      declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) 
      insert into @MyTable ([id], MyText) 
      select 1, 'some text; some more text' 
      union all select 2, 'text again; even more text' 
      union all select 3, 'text without a semicolon' 
      union all select 4, null -- test NULLs 
      union all select 5, '' -- test empty string 
      union all select 6, 'test 3 semicolons; second part; third part' 
      union all select 7, ';' -- test semicolon by itself  
      
      SELECT [dbo].[RegexReplace] ([MyText], '(;.*)', '') 
      FROM @MyTable 
      
      select * from @MyTable 
      
संबंधित मुद्दे