valores tipos tabla linea funciones ejemplos ejemplo cte con coincidencias buscar sql-server sql-server-2008-r2 common-table-expression

tipos - Cómo usar una declaración CTE en una función con valores de tabla en SQL Server



like en sql ejemplos (2)

Entiendo que algunas versiones del Proveedor Microsoft OLE DB para SQL Server (principalmente en Windows XP) no son compatibles WITH declaración WITH . Entonces, decidí mover mi declaración SQL a una función con valores de tabla y llamarla desde mi aplicación. Ahora estoy atascado. ¿Cómo debo usar la INSERT INTO con WITH ? Aquí está el código con el que he venido hasta ahora, pero a SQL Server no le gusta ... :-(

CREATE FUNCTION GetDistributionTable ( @IntID int, @TestID int, @DateFrom datetime, @DateTo datetime ) RETURNS @Table_Var TABLE ( [Count] int, Result float ) AS BEGIN INSERT INTO @Table_Var ([Count], Result) WITH T(Result) AS (SELECT ROUND(Result - AVG(Result) OVER(), 1) FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo) SELECT COUNT(*) AS [Count], Result FROM T GROUP BY Result RETURN END GO


ME GUSTA ESTO..

CREATE FUNCTION GetDistributionTable ( @IntID int, @TestID int, @DateFrom datetime, @DateTo datetime ) RETURNS @Table_Var TABLE ( [Count] int, Result float ) AS BEGIN WITH T AS ( select Ticket_Id,COUNT(1) Result from Customer_Survey group by MemberID,SiteId,Ticket_Id ) INSERT INTO @Table_Var ([Count], Result) SELECT COUNT(*) AS [Count], Result FROM T GROUP BY Result RETURN END GO


Puede omitir el CTE (instrucción WITH ) y, en su lugar, crear una función con valor de tabla en línea que utilice la subconsulta:

CREATE FUNCTION GetDistributionTable ( @IntID int, @TestID int, @DateFrom datetime, @DateTo datetime ) RETURNS TABLE AS RETURN ( SELECT COUNT(*) AS [Count], Result FROM ( SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo ) t GROUP BY Result ) GO

La sintaxis para el CTE en función de tabla de valores sería:

CREATE FUNCTION GetDistributionTable ( @IntID int, @TestID int, @DateFrom datetime, @DateTo datetime ) RETURNS TABLE AS RETURN ( WITH cte AS ( SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo ) SELECT COUNT(*) AS [Count], Result FROM cte GROUP BY Result ) GO

Su ejemplo parece estar usando un TVF de múltiples instrucciones (insertar y seleccionar), cuando tiene la opción, intente usar el TVF en línea porque el TVF de múltiples declaraciones puede evitar que el optimizador de consultas elija un mejor plan de ejecución (la diferencia de rendimiento se explica here )