sql - usar - Pasa por una mesa usando Cross apply y UNION TODOS los resultados
outer apply sql w3schools (1)
Intentando escribir una consulta que se comportará como un foreach
Consulta :
select label ,NTILE(10) over(order by label ASC) Quartile INTO #labelTempTab from dbo.ReportFieldsLookup
Los datos serán como:
label Quartile
----- --------
la1 1
la2 1
la3 1
sa1 2
sa2 2
sq3 2
ha1 3
ha2 3
ha3 3
ka1 4
ka2 4
kas3 4
Continuación de la consulta:
DECLARE @sql nvarchar(max)
SELECT * INTO #SetValuesTable FROM svo_tbl
SET @sql = ''SELECT MNUM, Label , LabelValue ,[Property Type] FROM #SetValuesTable ''
+'' CROSS APPLY ( VALUES ''
+ stuff(( SELECT '',(''''''+ replace(C.label,'''''''',''"'') + '''''','' + quotename(C.label) + '')'' FROM #labelTempTab c WHERE c.Quartile = 1 group by label FOR xml path('''')), 1, 1, '''')
+'' ) AS UPTab (Label , LabelValue);''
EXEC(@sql)
La consulta anterior no se activará solo para Quartile = 1
¿Cómo puedo hacer que funcione entre 1 y n y unir todos los resultados?
los datos en #SetValuesTable se verán así:
MNUM la1 la2 la3 sa1 sa2 sq3 ha1 ha2 ha3 ka1 ka2 Property Type
12 1 0 2 1 0 8 3 4 0 1 2 s
13 4 0 5 1 6 8 5 2 1 1 3 p
El resultado (salida esperada) debería verse como
MNUM Label LabelValue Property Type
12 la1 1 s
12 la2 0 s
12 la3 2 s
12 sa1 1 s
12 sa2 0 s
12 sa3 8 s
........
13 ka1 1 p
13 ka2 1 p
12 ka3 3 p
continuación de la consulta:
SET @sql = @sql + '' INNER JOIN dbo.ReportFieldsLookup tt ON tt.label = Label''
SET @sql = @sql + ''INNER JOIN dbo.SplitStrings_Ordered(''''''''''09-404811,10-433495,10-433575,10-423789'''''''', '','') AS s ON #SetValuesTable.MNum = s.MNum ORDER BY s.[Index];
Las dos declaraciones anteriores están tomando mucho tiempo. Especialmente la última unión interna que es para ordenar está tardando mucho tiempo. Creo que el uso de cross apply podría reducir enormemente el tiempo de ejecución.
Use Cross Apply
para evitar el resultado. La consulta de consulta dinámica debe construirse en este formato.
SELECT mnum,
label,
label_value,
[Property Type]
FROM #SetValuesTable
CROSS apply(VALUES (''la1'',la1),(''la2'',la2),(''la3'',la3),
(''sa1'',sa1),(''sa2'',sa2),(''sa3'',sa3),
(''ha1'',ha1),(''ha2'',ha2),(''ha3'',ha3),
(''ka1'',ka1),(''ka2'',ka2)) cs (label, label_value)
Dynamic query
debería ser algo así como
DECLARE @label VARCHAR(max)='''',
@sql NVARCHAR(max)
SELECT @label += ''('' + '''''''' + label + '''''','' + label + ''),''
FROM (SELECT DISTINCT Isnull(label, '''') label
FROM #labelTempTab)a
SELECT @label = LEFT(@label, Len(@label) - 1)
SET @sql= ''SELECT mnum,
label,
label_value,
[Property Type]
FROM #SetValuesTable
CROSS apply(VALUES '' + @label
+ '') cs (label, label_value) ''
EXEC Sp_executesql @sql
Nota: Dado que está generando una lista de valores de la tabla #labelTempTab
, asegúrese de tener todas las etiquetas presentes en la tabla #SetValuesTable