tabla stored sp_rename script renombrar name ejemplos constraint column sql stored-procedures

stored - ¿Puedo pasar el nombre de la columna como parámetro de entrada en SQL almacenado? Procedimiento



sp_rename column (8)

create procedure sp_First @columnname varchar AS begin select @columnname from Table_1 end exec sp_First ''sname''

Mi requisito es pasar los nombres de las columnas como parámetros de entrada. Lo intenté así, pero me dio una salida incorrecta.

Así que ayúdame


Como lo menciona MatBailie Esto es mucho más seguro ya que no es una consulta dinámica y hay menos posibilidades de inyección sql. Agregué una situación en la que incluso quieres que la cláusula where sea dinámica. XX YY son nombres de columnas

CREATE PROCEDURE [dbo].[DASH_getTP_under_TP] ( @fromColumnName varchar(10) , @toColumnName varchar(10) , @ID varchar(10) ) as begin -- this is the column required for where clause declare @colname varchar(50) set @colname=case @fromUserType when ''XX'' then ''XX'' when ''YY'' then ''YY'' end select SelectedColumnId from ( select case @toColumnName when ''XX'' then tablename.XX when ''YY'' then tablename.YY end as SelectedColumnId, From tablename where (case @fromUserType when ''XX'' then XX when ''YY'' then YY end)= ISNULL(@ID , @colname) ) as tbl1 group by SelectedColumnId end


Esto no es posible. Utilice SQL dinámico (peligroso) o una expresión de caso gigantesca (lenta).


Intente usar SQL dinámico:

create procedure sp_First @columnname varchar AS begin declare @sql nvarchar(4000); set @sql=''select [''+@columnname+''] from Table_1''; exec sp_executesql @sql end go exec sp_First ''sname'' go


No. Eso solo seleccionaría el valor del parámetro. Necesitarías usar sql dinámico.

En su procedimiento, tendría lo siguiente:

DECLARE @sql nvarchar(max) = ''SELECT '' + @columnname + '' FROM Table_1''; exec sp_executesql @sql, N''''


Por favor prueba con esto Espero que funcione para ti.

Create Procedure Test ( @Table VARCHAR(500), @Column VARCHAR(100), @Value VARCHAR(300) ) AS BEGIN DECLARE @sql nvarchar(1000) SET @sql = ''SELECT * FROM '' + @Table + '' WHERE '' + @Column + '' = '' + @Value --SELECT @sql exec (@sql) END -----execution---- /** Exec Test Products,IsDeposit,1 **/


Puede pasar el nombre de la columna pero no puede usarlo en un estado sqlmnt como

Select @Columnname From Table

Se podría construir una cadena sql dinámica y ejecutarla como EXEC (@SQL)

Para obtener más información, consulte esta respuesta en sql dinámico.

Dynamic SQL Pros y contras


Puedes hacer esto de varias maneras.

Uno, es construir la consulta usted mismo y ejecutarla.

SET @sql = ''SELECT '' + @columnName + '' FROM yourTable'' sp_executesql @sql

Si optas por ese método, asegúrate de santificar tu opinión. Incluso si sabe que su aplicación solo dará nombres de columna ''reales'', ¿qué pasa si alguien encuentra una grieta en su seguridad y puede ejecutar el SP directamente? Entonces pueden ejecutar casi cualquier cosa que quieran. Con SQL dinámico, siempre, siempre , valide los parámetros.

Alternativamente, puede escribir una declaración CASE ...

SELECT CASE @columnName WHEN ''Col1'' THEN Col1 WHEN ''Col2'' THEN Col2 ELSE NULL END as selectedColumn FROM yourTable

Esto es un poco más largo, pero mucho más seguro.


Create PROCEDURE USP_S_NameAvilability (@Value VARCHAR(50)=null, @TableName VARCHAR(50)=null, @ColumnName VARCHAR(50)=null) AS BEGIN DECLARE @cmd AS NVARCHAR(max) SET @Value = ''''''''+@Value+ '''''''' SET @cmd = N''SELECT * FROM '' + @TableName + '' WHERE '' + @ColumnName + '' = '' + @Value EXEC(@cmd) END

Como he intentado con una de las respuestas, se está ejecutando con éxito, pero mientras ejecuta no está dando salida correcta, lo anterior funciona bien