2009-07-08 10 views
15

मैं एक कष्टप्रद डेटाबेस से निपट रहा हूं जहां एक फ़ील्ड में वास्तव में दो अलग-अलग फ़ील्ड संग्रहीत किए जाने चाहिए। तो कॉलम को "पहली स्ट्रिंग ~ @ ~ दूसरी स्ट्रिंग" जैसी कुछ संग्रहीत किया जाता है, जहां "~ @ ~" डिलीमीटर होता है। (फिर से, मैं इस डिजाइन नहीं किया, मैं तो बस इसे ठीक करने की कोशिश कर रहा हूँ।)एसक्यूएल सर्वर: स्ट्रॉप्स() के बराबर?

मैं एक प्रश्न दो कॉलम में इस ले जाना चाहते हैं, जो कुछ इस तरह दिखेगा:

UPDATE UserAttributes 
SET str1 = SUBSTRING(Data, 1, STRPOS(Data, '[email protected]~')), 
    str2 = SUBSTRING(Data, STRPOS(Data, '[email protected]~')+3, LEN(Data)-(STRPOS(Data, '[email protected]~')+3)) 

लेकिन मुझे नहीं लगता कि स्ट्रॉप्स के बराबर कोई भी मौजूद है।

उत्तर

34

उपयोगकर्ता CHARINDEX:

Select CHARINDEX ('S','MICROSOFT SQL SERVER 2000') 
Result: 6 

Link

+0

यह ध्यान रखना महत्वपूर्ण है कि तर्कों का क्रम यहां स्विच किया गया है, जिससे आप "स्ट्रिंग या बाइनरी डेटा को छोटा कर दिया जाएगा" त्रुटियों के कारण, यदि आप सुई और घास के समान क्रम में छोड़ देते हैं strpos। – Noumenon

0

आप यहां दिए गए कॉलम में अपने डेटा की जरूरत है कि मैं क्या उपयोग करते हैं:

create FUNCTION [dbo].[fncTableFromCommaString] (@strList varchar(8000)) 
RETURNS @retTable Table (intValue int) AS 
BEGIN 

    DECLARE @intPos tinyint 

    WHILE CHARINDEX(',',@strList) > 0 
    BEGIN 
     SET @intPos=CHARINDEX(',',@strList) 
     INSERT INTO @retTable (intValue) values (CONVERT(int, LEFT(@strList,@intPos-1))) 
     SET @strList = RIGHT(@strList, LEN(@strList)[email protected]) 
    END 
    IF LEN(@strList)>0 
     INSERT INTO @retTable (intValue) values (CONVERT(int, @strList)) 

    RETURN 

END 

बस की जगह ',' समारोह में अपने सीमांकक के साथ (या शायद यह parametrize)

संबंधित मुद्दे