복붙노트

[SQL] 어떻게 동적 SQL 쿼리 세트 테이블 이름?

SQL

어떻게 동적 SQL 쿼리 세트 테이블 이름?

나는 동적 SQL 쿼리에 세트 테이블의 이름을합니다. 나는 다음과 같은 매개 변수에 성공적으로 시도 :

/* Using sp_executesql */
/* Build and Execute a Transact-SQL String with a single parameter 
value Using sp_executesql Command */

/* Variable Declaration */
DECLARE @EmpID AS SMALLINT
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
/* set the parameter value */
SET @EmpID = 1001
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID = @EmpID' 
/* Specify Parameter Format */
SET @ParameterDefinition =  '@EmpID SMALLINT'
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID

지금은 매개 변수를 사용하여 동적으로 테이블 이름을 가지고 싶어하지만 난 그렇게하는 데 실패했습니다. 나를 인도 해주십시오.

해결법

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

    1.이 같은 수동으로 SQL 문자열을 구성해야하므로 테이블 이름, 매개 변수로 제공 할 수 없습니다

    이 같은 수동으로 SQL 문자열을 구성해야하므로 테이블 이름, 매개 변수로 제공 할 수 없습니다

    SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID' 
    

    그러나 응용 프로그램이 SQL 주입에 대한 쿼리에 취약 할 것으로 직접에 사용자가 @tablename의 값을 입력 할 수 없습니다 있는지 확인하십시오. 이 하나의 해결 방안이 대답을 참조하십시오.

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

    2.SQL 주입에 대한 도움말을 방지하려면, 나는 일반적으로 가능한 기능을 사용하려고합니다. 이 경우에, 당신은 할 수 있습니다 :

    SQL 주입에 대한 도움말을 방지하려면, 나는 일반적으로 가능한 기능을 사용하려고합니다. 이 경우에, 당신은 할 수 있습니다 :

    ...
    SET @TableName = '<[db].><[schema].>tblEmployees'
    SET @TableID   = OBJECT_ID(TableName) --won't resolve if malformed/injected.
    ...
    SET @SQLQuery = 'SELECT * FROM ' + OBJECT_NAME(@TableID) + ' WHERE EmployeeID = @EmpID' 
    
  3. ==============================

    3.이 시도:

    이 시도:

    /* Variable Declaration */
    DECLARE @EmpID AS SMALLINT
    DECLARE @SQLQuery AS NVARCHAR(500)
    DECLARE @ParameterDefinition AS NVARCHAR(100)
    DECLARE @TableName AS NVARCHAR(100)
    /* set the parameter value */
    SET @EmpID = 1001
    SET @TableName = 'tblEmployees'
    /* Build Transact-SQL String by including the parameter */
    SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID' 
    /* Specify Parameter Format */
    SET @ParameterDefinition =  '@EmpID SMALLINT'
    /* Execute Transact-SQL String */
    EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID
    
  4. ==============================

    4.이것은 다른 정보를 동적으로 얻을 동적 스키마를 얻고 위해 데이터베이스 내에서 다른 테이블에 추가하는 가장 좋은 방법입니다

    이것은 다른 정보를 동적으로 얻을 동적 스키마를 얻고 위해 데이터베이스 내에서 다른 테이블에 추가하는 가장 좋은 방법입니다

    선택 @Sql = '['+ SCHEMA_NAME (schema_id) + ','. ','이름 + + ']'sys.tables FROM하여 SchemaTable AS ''를 선택 #tables 삽입 '

    exec (@sql)
    

    물론 #tables 동적 테이블은 프로 시저에

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

    5.@ user1172173 SQL 주입 취약점을 해결하는 의해 이전 답변을 구축, 아래 참조 :

    @ user1172173 SQL 주입 취약점을 해결하는 의해 이전 답변을 구축, 아래 참조 :

    CREATE PROCEDURE [dbo].[spQ_SomeColumnByCustomerId](
    @CustomerId int,
    @SchemaName varchar(20),
    @TableName nvarchar(200)) AS
    SET Nocount ON
    DECLARE @SQLQuery AS NVARCHAR(500)
    DECLARE @ParameterDefinition AS NVARCHAR(100)
    DECLARE @Table_ObjectId int;
    DECLARE @Schema_ObjectId int;
    DECLARE @Schema_Table_SecuredFromSqlInjection NVARCHAR(125)
    
    SET @Table_ObjectId = OBJECT_ID(@TableName)
    SET @Schema_ObjectId = SCHEMA_ID(@SchemaName)
    SET @Schema_Table_SecuredFromSqlInjection = SCHEMA_NAME(@Schema_ObjectId) + '.' + OBJECT_NAME(@Table_ObjectId)
    
    SET @SQLQuery = N'SELECT TOP 1 ' + @Schema_Table_SecuredFromSqlInjection + '.SomeColumn 
    FROM dbo.Customer 
    INNER JOIN ' + @Schema_Table_SecuredFromSqlInjection + ' 
    ON dbo.Customer.Customerid = ' + @Schema_Table_SecuredFromSqlInjection + '.CustomerId 
    WHERE dbo.Customer.CustomerID = @CustomerIdParam 
    ORDER BY ' + @Schema_Table_SecuredFromSqlInjection + '.SomeColumn DESC' 
    SET @ParameterDefinition =  N'@CustomerIdParam INT'
    
    EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @CustomerIdParam = @CustomerId; RETURN
    
  6. from https://stackoverflow.com/questions/20678725/how-to-set-table-name-in-dynamic-sql-query by cc-by-sa and MIT license