2011-04-12 18 views
21

tengo un procedimiento almacenado de Microsoft SQL cuyo nombre columna quiero establecer a través de una variable que se pasa en ella:SQL: Seleccionar nombre de la columna dinámica en función de la variable

CREATE PROCEDURE [My_Procedure] 
    @myDynamicColumn varchar(50) 
AS BEGIN 
    SELECT 'value' AS @myDynamicColumn 
END 

esto no funciona ("sintaxis incorrecta "). Si envuelvo con el nombre de columna []:

SELECT 'value' AS [@myDynamicColumn] 

El nombre de la columna da salida literalmente como '@myDynamicColumn' en lugar del valor real. ¿Hay alguna manera de hacer esto? He examinado artículos dinámicos de SQL pero nada es exactamente lo que estoy pidiendo.

+1

¿Por qué? Esta no es la forma en que debería usarse SQL – gbn

+0

@gbn: derecho. @dotNewkow: estoy seguro de que este es solo un ejemplo artificial para ilustrar su problema, pero gbn es correcto: esto es complejo porque está mal. Si necesita alias un retorno del procedimiento almacenado, simplemente haga el aliasing en el código de llamada, donde obviamente ya conoce el valor de @myDynamicColumn. Si publica más detalles sobre su problema, tal vez podamos ofrecerle más que sql dinámico. –

+0

Buena pregunta. Sí, entiendo los peligros del SQL dinámico. @ Nathan Skerl, estás en lo cierto, normalmente querrías configurar esto a través del código de llamada. Sin embargo, estoy ejecutando esta consulta como una conexión de datos en Excel para fines de informes. El cliente quiere 4 informes con relativamente los mismos datos pero con diferentes nombres de columna, así que hice un proceso almacenado para la reutilización y para seguir el principio DRY. Si esto fuera una vista, podría: "SELECCIONAR [columna] AS [Mi columna dinámica] DE [Mi vista]" pero como es un proceso almacenado, solo puedo hacer "EXEC Mi_Procedimiento 'Mi nombre de columna'". – dotNetkow

Respuesta

37
EXEC ('SELECT ''value'' AS ' + @myDynamicColumn) 
+0

Gracias, respondiste 45 segundos después del otro tipo, ¡así que haz un voto positivo! – dotNetkow

+0

@dotNetkow: En realidad, tenía 9 segundos de ventaja sobre "el otro tipo", 15:49:30 vs. 15:49:39. –

+29

Siempre una dama de honor, nunca una novia. – Josh

20

Se puede construir la consulta en una cadena y usar exec

CREATE PROCEDURE [My_Procedure] 
    @myDynamicColumn varchar(50) 
AS BEGIN 
    EXEC('SELECT ''value'' AS ' + @myDynamicColumn) 
END 
Cuestiones relacionadas