Red de conocimiento informático - Problemas con los teléfonos móviles - sql cambia una fila de datos a varias filas de datos

sql cambia una fila de datos a varias filas de datos

Su enfoque (no es necesario crear una vista):

SELECCIONE EL 100 POR CIENTO SUPERIOR *

FROM (SELECT *, SUBSTRING(Picture, 32, 30) AS PICTUREV FROM dbo.products

DONDE ( SUBSTRING(Imagen, 32, 30) <> '')

unión

SELECT *, SUBSTRING(Imagen, 63, 30) AS PICTUREV FROM productos dbo

DÓNDE ( SUBSTRING(ImagenB, 63, 30) <>'').

unión

SELECT *, SUBSTRING(Imagen, 94, 30) COMO IMAGEN V DE dbo.products

DONDE ( SUBSTRING(PictureB, 94, 30) <> '')

)DERIVEDTBL

ORDEN POR .. .

Creo que tu subcadena debería calcularse así:

SUBSTRING(Imagen, 0*31+1,30)

SUBSTRING(Imagen, 1* 31+ 1,30)

SUBSTRING(Imagen, 2*31+1,30)

SUBSTRING(Imagen,3*31+1,30)

Por lo tanto, escribir de esta manera en una declaración hará que sea más fácil de escribir, más fácil de entender y menos propenso a errores. Esto tampoco afecta la eficiencia.

Su enfoque está bien, excepto por la redundancia de tener que crear tantas vistas, pero no se da cuenta de que los nombres de archivos desiguales separarán cadenas con delimitadores.

Si la cadena está dividida por delimitadores, debes usar mi función personalizada y mi declaración.

Si se trata de segmentos de cadena de longitud fija como los que escribiste, entonces usa tu método exactamente, es decir, ligeramente modificado, sin crear una vista intermedia

Además, si te gustan las vistas, puedes construir uno:

Crear vista DERIVEDTBL

como

crear vista

SELECT *, SUBSTRING(Imagen, 0*31+1, 30) COMO IMAGEN V DE dbo.productWHERE (SUBSTRING(Imagen, 32, 30) <> '')

unión

SELECT *, SUBSTRING(Imagen, 1*31+1, 30, 30) COMO IMAGEN V DE dbo.products DONDE (SUBSTRING(ImagenB, 63, 30) <> '')

unión

SELECT *, SUBSTRING(Imagen, 2*31 +1,30, 30) COMO IMAGEN V DE dbo.products DONDE (SUBSTRING(ImagenB, 94, 30) <> '')

unión

SELECT *, SUBSTRING(Imagen, 3*31+1,30, 30) COMO IMAGEN V DE dbo.products DONDE (SUBSTRING(ImagenB, 94, 30) <> '')

unión

SELECT *, SUBSTRING (Imagen, 4*31+1,30, 30) COMO IMAGEN V DE dbo.products DONDE (SUBSTRING(ImagenB, 94, 30) <> '')

union

SELECCIONAR *, SUBSTRING(Imagen, 5*31+1,30, 30) COMO IMAGENV DE dbo.products DONDE (SUBSTRING(ImagenB, 94, 30) <> '')

--.... Para expandirse hacia abajo de cualquier manera, simplemente cambie el número de secuencia en SUBSTRING.

ir

Llamar así:

SELECCIONAR TOP N*

DE DERIVEDTBL

ORDENAR POR.. .

=================

Resuelve el problema en una frase como esta:

SELECCIONAR ID , TÍTULO,DBO.

UNION

SELECCIONE ID, TÍTULO,DBO.MYSPLIT(PICTURES,5,'|') COMO IMAGEN,5 COMO SN de TABLENAME

UNION

SELECCIONE ID, TÍTULO,DBO.MYSPLIT(PICTURES,6,'|') COMO IMAGEN,6 COMO SN de TABLENAME

-- . >

ORDENAR POR ID,TÍTULO,SN

Además, su función requiere cadenas de igual longitud. Quiero saber por qué no tiene la primera cadena.

SUBSTRING(Imagen, 32, 30)

¿Es esto?

SUBSTRING(Imagen, 1, 30)

=====================

Aquí solo hay 6 filas, puede cumplir con el requisito de 6 imágenes por identificación. Puedes escribir tantas líneas como quieras, lo que significa que el número máximo de imágenes por ID es 6. ¡Puedes escribir hasta 100 líneas o puedes escribir hasta 1000 líneas!

Aquí también puedes agregar un campo de Número de serie (SN) para asegurarte de que el orden de las imágenes coincida con la disposición original. Puedes eliminarlo si no lo necesitas.

La siguiente función es un número personalizado muy útil para extraer parte de una cadena. Ejecútelo e incorpórelo a su base de datos, lo que le brindará una gran comodidad para su programación futura. Por supuesto, esta es la función utilizada en este ejemplo.

crear FUNCIÓN mysplit - Divide la cadena en segmentos según ciertos delimitadores y extrae subcadenas según el número de secuencia especificado

(@str nvarchar(2000), - Cadena fuente

@sn int, - número de secuencia extraído

@Deli varchar(1) - delimitador

)

RETURNS varchar(100 )

COMO

COMENZAR

declarar @primer int,@último int,@resultado varchar(1000),@sn0 int

seleccionar @sn0= 0,@primero=0,@ÚLTIMO=1,@str=@str+REPLICATE(@DELI,1)

mientras @sn0! =@sn

Inicio

seleccione @sn0=@sn1,@first=@LAST,@ last=charindex(@DELI,@str,@LAST)+1

Fin

if @último-@primero-1<0

set @result=''

else

SET @RESULT=SUBSTRING (@str,@FIRST,@LAST-@FIRST-1)

RETURN ( @RESULT )

FIN

GO