53 votes

Puis-je passer le nom d'une colonne comme paramètre d'entrée dans une procédure stockée SQL ?

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

Mon besoin est de passer des noms de colonnes comme paramètres d'entrée. J'ai essayé comme cela mais cela a donné un résultat erroné.

Aidez-moi

3 votes

Pourriez-vous sélectionner la meilleure réponse à cette question, la première réponse actuelle étant trompeuse.

2voto

Jon Raynor Points 2312

Vous pouvez transmettre le nom de la colonne, mais vous ne pouvez pas l'utiliser dans une déclaration SQL telle que

Select @Columnname From Table

On peut construire une chaîne sql dynamique et l'exécuter comme suit EXEC (@SQL)

Pour plus d'informations, voir cette réponse sur le SQL dynamique.

Avantages et inconvénients de Dynamic SQL

0voto

Saronyo Points 148

Comme mentionné par MatBailie C'est beaucoup plus sûr puisqu'il ne s'agit pas d'une requête dynamique et qu'il y a moins de risques d'injection sql. J'ai ajouté une situation où vous voulez même que la clause where soit dynamique. XX YY sont les noms des colonnes

            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

0voto

Smh Points 111

Premier tirage ;

CREATE PROCEDURE sp_First @columnname NVARCHAR(128)--128 = SQL Server Maximum Column Name Length
AS
BEGIN

    DECLARE @query NVARCHAR(MAX)

    SET @query = 'SELECT ' + @columnname + ' FROM Table_1'

    EXEC(@query)

END

Deuxième passage ;

EXEC sp_First 'COLUMN_Name'

-3voto

Sujay Points 21

P J'espère que cela fonctionnera pour vous.

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 **/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X