sql cambia una fila de datos a varias filas de datos
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) p>
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