Подтвердить что ты не робот

Могу ли я передать имя столбца в качестве входного параметра в SQL хранимой процедуре

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

Мое требование - передавать имена столбцов в качестве входных параметров. Я так пробовал, но он дал неправильный результат.

Так помогите мне

4b9b3361

Ответ 1

Вы можете сделать это несколькими способами.

Во-первых, нужно создать запрос самостоятельно и выполнить его.

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

Если вы выберете этот метод, будьте очень уверены в том, что сможете использовать ваш вход. Даже если вы знаете, что ваше приложение будет давать только "настоящие" имена столбцов, что, если кто-то обнаружит ошибку в вашей безопасности и сможет выполнить SP напрямую? Тогда они могут выполнить практически все, что им нравится. С динамическим SQL всегда всегда проверяйте параметры.

В качестве альтернативы вы можете написать оператор CASE...

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

Это немного более длинный, но гораздо более безопасный.

Ответ 2

Нет. Это просто выберет значение параметра. Вам нужно будет использовать динамический sql.

В вашей процедуре у вас будет следующее:

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

Ответ 3

Попробуйте использовать динамический SQL:

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

exec sp_First 'sname'
go

Ответ 4

Это невозможно. Используйте либо динамический SQL (опасный), либо гигантское выражение case (медленное).

Ответ 5

Вы можете передать имя столбца, но вы не можете использовать его в sql statemnt, например

Select @Columnname From Table

Можно построить динамическую строку sql и выполнить ее как EXEC (@SQL)

Для получения дополнительной информации см. этот ответ в динамическом sql.

Динамические плюсы и минусы SQL

Ответ 6

   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 = ''''[email protected]+ ''''
        SET @cmd = N'SELECT * FROM ' + @TableName + ' WHERE ' +  @ColumnName + ' = ' + @Value
        EXEC(@cmd)
      END

Как я пробовал один из ответов, он выполняется успешно, но при запуске его не дает корректного вывода, это хорошо работает

Ответ 7

Как упоминалось MatBailie Это гораздо более безопасно, так как это не динамический запрос, и у него меньше шансов на SQL-инъекцию. Я добавил одну ситуацию, когда вы даже хотите, чтобы предложение where было динамическим. XX YY - имена столбцов

            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

Ответ 8

Попробуйте с этим.   Надеюсь, это сработает для вас.

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