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.
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