2009-07-08 16 views
15

Estoy tratando con una base de datos molesta donde un campo contiene lo que realmente debería almacenarse dos campos separados. Así que la columna se almacena algo así como "La primera cadena ~ @ ~ La segunda cadena", donde "~ @ ~" es el delimitador. (Una vez más, no diseñó esto, sólo estoy tratando de solucionarlo.)SQL Server: cualquier equivalente de strpos()?

Quiero una consulta para mover este en dos columnas, que sería algo como esto:

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)) 

Pero No puedo encontrar que exista un equivalente a strpos.

Respuesta

34

charindex usuario:

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

Link

+0

Es importante tener en cuenta que el orden de los argumentos se cambia aquí, lo que genera una gran cantidad de errores de "cadena o datos binarios se truncarán" si deja la aguja y el pajar en el mismo orden que strpos. – Noumenon

0

Si necesita los datos en columnas aquí es lo que yo uso:

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 

basta con sustituir '', en la función con el delimitador (o tal vez incluso parametrizar ella)

Cuestiones relacionadas