Pregunta

En la aplicación en la que estoy trabajando para portar a la web, actualmente accedemos dinámicamente a diferentes tablas en tiempo de ejecución de una ejecución a otra, en función de una " template " cadena que se especifica. Me gustaría trasladar la carga de hacerlo a la base de datos ahora que nos estamos trasladando al servidor SQL, por lo que no tengo que meterme con un GridView dinámico. Pensé en escribir un UDF con valores de tabla con un parámetro para el nombre de la tabla y otro para la cláusula WHERE de consulta.

Ingresé lo siguiente para mi UDF pero obviamente no funciona. ¿Hay alguna forma de tomar un varchar o una cadena de algún tipo y obtener una referencia de tabla que pueda funcionar en la cláusula FROM?

CREATE FUNCTION TemplateSelector 
(   
@template varchar(40),
@code varchar(80)
)
RETURNS TABLE 
AS
RETURN 
(
SELECT * FROM @template WHERE ProductionCode = @code
)

O alguna otra forma de obtener un conjunto de resultados similar en concepto a este. Básicamente todos los registros en la tabla indicados por varchar @template con el ProductionCode correspondiente del @code.

Obtengo el error " Debo declarar la variable de tabla " @template " " ;, por lo que el servidor SQL probablemente sea lo que intento seleccionar de una variable de tabla .

En Edición: Sí, no necesito hacerlo en una función, puedo ejecutar Procs almacenados, simplemente no he escrito ninguno de ellos antes.

¿Fue útil?

Solución

CREATE PROCEDURE TemplateSelector 
(   
    @template varchar(40),
    @code varchar(80)
)

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)

Esto funciona, aunque no es un UDF.

Otros consejos

La única forma de hacerlo es con el comando exec.

Además, debe moverlo a un proceso almacenado en lugar de una función. Aparentemente, las funciones no pueden ejecutar sql dinámico.

La única forma en que esto sería posible es con SQL dinámico, sin embargo, SQL SQL no es compatible con SqlServer dentro de una función.

Lamento decir que estoy bastante seguro de que NO es posible hacer esto dentro de una función.

Si estuviera trabajando con procedimientos almacenados, sería posible.

Además, debe tenerse en cuenta que, al reemplazar el nombre de la tabla en la consulta, ha destruido la capacidad de SQL Server para almacenar en caché el plan de ejecución de la consulta. Esto prácticamente reduce la ventaja de usar un UDF o SP a cero. También podría llamar directamente a la consulta SQL.

Tengo un número finito de tablas que quiero poder abordar, así que podría escribir algo usando IF, que pruebe @template para coincidencias con varios valores y para cada ejecución de coincidencias

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

Parece que esa es una mejor opción

Si tiene numerosas tablas con una estructura idéntica, generalmente significa que no ha diseñado su base de datos de forma normal. Debe unificarlos en una sola tabla. Es posible que deba asignar a esta tabla una columna de atributos más para distinguir los conjuntos de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top