복붙노트

[SQL] 나는 SQL 저장 프로 시저에 입력 매개 변수로 열 이름을 전달할 수 있습니다

SQL

나는 SQL 저장 프로 시저에 입력 매개 변수로 열 이름을 전달할 수 있습니다

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

내 요구 사항은 입력 매개 변수로 열 이름을 전달하는 것입니다. 나는 그런 시도했지만 잘못된 출력을했다.

도움말 나 그래서

해결법

  1. ==============================

    1.당신은 몇 가지 방법으로이 작업을 수행 할 수 있습니다.

    당신은 몇 가지 방법으로이 작업을 수행 할 수 있습니다.

    하나는 쿼리를 직접 구축하고 실행하는 것입니다.

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

    당신이 방법을 선택하는 경우, 귀하의 의견을 santise 매우 확신 할 수. 당신이 당신의 응용 프로그램은 '진짜'열 이름을 줄 것이다 알고있다하더라도, 직접 SP를 실행할 수 무엇을 보안의 일부-하나 발견 균열 여부와인가? 그런 다음 그들은 단지 그들이 원하는 무엇이든 실행할 수 있습니다. 동적 SQL로, 항상, 항상, 매개 변수를 확인합니다.

    또는, CASE 문을 작성할 수 있습니다 ...

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

    이것은 좀 더 긴 호흡이지만, 훨씬 더 안전합니다.

  2. ==============================

    2.아뇨 그냥 매개 변수 값을 선택합니다. 당신은 동적 SQL을 사용해야합니다.

    아뇨 그냥 매개 변수 값을 선택합니다. 당신은 동적 SQL을 사용해야합니다.

    당신의 절차에서는 다음을 할 것이다 :

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

    3.동적 SQL을 사용해보십시오 :

    동적 SQL을 사용해보십시오 :

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

    4.이건 불가능 해. 사용 동적 SQL (위험) 또는 거대한 경우 식 (느린) 중 하나.

    이건 불가능 해. 사용 동적 SQL (위험) 또는 거대한 경우 식 (느린) 중 하나.

  5. ==============================

    5.당신은 열 이름을 전달할 수 있지만, 당신은 SQL 문을 같은에서 사용할 수 없습니다

    당신은 열 이름을 전달할 수 있지만, 당신은 SQL 문을 같은에서 사용할 수 없습니다

    Select @Columnname From Table
    

    하나는 동적 SQL 문자열을 구축하고 EXEC처럼 실행할 수 있습니다 (@SQL)

    자세한 내용은 동적 SQL에 대한이 답변을 참조하십시오.

    동적 SQL 장단점

  6. ==============================

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

    내가 하나를 대답을 시도, 그것은 성공적으로 실행하지만,지고도 그 포기하지 않을 올바른 출력, 위의 작업을 실행하는 동안

  7. ==============================

    7.MatBailie에서 언급 한 바와 같이 이 동적 쿼리하지 아플리케가 SQL 주입의 적은 기회이기 때문에이 훨씬 더 안전합니다. 당신도 절은 수 동적 원하는 내가 추가 한 상황. XX YY는 열 이름입니다

    MatBailie에서 언급 한 바와 같이 이 동적 쿼리하지 아플리케가 SQL 주입의 적은 기회이기 때문에이 훨씬 더 안전합니다. 당신도 절은 수 동적 원하는 내가 추가 한 상황. 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. ==============================

    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 **/
    
  9. from https://stackoverflow.com/questions/10092869/can-i-pass-column-name-as-input-parameter-in-sql-stored-procedure by cc-by-sa and MIT license