سؤال

أنا أتعامل مع قاعدة بيانات مزعجة حيث يحتوي حقل واحد على ما يجب تخزينه حقا اثنين من الحقول المنفصلة. لذلك يتم تخزين العمود شيئا مثل "السلسلة الأولى ~ @ ~ ~ السلسلة الثانية"، حيث "~ @ ~" هو محدد. (مرة أخرى، لم أقم بتصميم هذا، أنا أحاول فقط إصلاحه.)

أريد استعلام لنقل هذا إلى أعمدة، من شأنها أن تبدو مثل هذا:

UPDATE UserAttributes
SET str1 = SUBSTRING(Data, 1, STRPOS(Data, '~@~')),
    str2 = SUBSTRING(Data, STRPOS(Data, '~@~')+3, LEN(Data)-(STRPOS(Data, '~@~')+3))

لكنني لا أستطيع أن أجد أن أي ما يعادل stroppos.

هل كانت مفيدة؟

المحلول

Charindex المستخدم:

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

وصلة

نصائح أخرى

يجب أن تعطيك وظيفة PatIndex موقع النمط كجزء من سلسلة.

PATINDEX ( '%pattern%' , expression )

http://msdn.microsoft.com/en-us/library/ms188395.aspx.

إذا كنت بحاجة إلى بياناتك في الأعمدة هنا هو ما أستخدمه:

  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)-@intPos)
    END
    IF LEN(@strList)>0 
        INSERT INTO @retTable (intValue) values (CONVERT(int, @strList))

    RETURN

END

مجرد استبدال "،" في الوظيفة مع محدد (أو ربما حتى يذكره)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top