[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.이 같은 수동으로 SQL 문자열을 구성해야하므로 테이블 이름, 매개 변수로 제공 할 수 없습니다
이 같은 수동으로 SQL 문자열을 구성해야하므로 테이블 이름, 매개 변수로 제공 할 수 없습니다
SET @SQLQuery = 'SELECT * FROM ' + @TableName + ' WHERE EmployeeID = @EmpID'
그러나 응용 프로그램이 SQL 주입에 대한 쿼리에 취약 할 것으로 직접에 사용자가 @tablename의 값을 입력 할 수 없습니다 있는지 확인하십시오. 이 하나의 해결 방안이 대답을 참조하십시오.
-
==============================
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.이 시도:
이 시도:
/* 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.이것은 다른 정보를 동적으로 얻을 동적 스키마를 얻고 위해 데이터베이스 내에서 다른 테이블에 추가하는 가장 좋은 방법입니다
이것은 다른 정보를 동적으로 얻을 동적 스키마를 얻고 위해 데이터베이스 내에서 다른 테이블에 추가하는 가장 좋은 방법입니다
선택 @Sql = '['+ SCHEMA_NAME (schema_id) + ','. ','이름 + + ']'sys.tables FROM하여 SchemaTable AS ''를 선택 #tables 삽입 '
exec (@sql)
물론 #tables 동적 테이블은 프로 시저에
-
==============================
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
from https://stackoverflow.com/questions/20678725/how-to-set-table-name-in-dynamic-sql-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] GROUP BY와 집계 순차적 인 숫자 값 (0) | 2020.04.02 |
---|---|
[SQL] PostgreSQL은 : 같은 쿼리에서 계산 된 열을 사용하여 (0) | 2020.04.02 |
[SQL] ON 대 WHERE 절 가입하여 (0) | 2020.04.02 |
[SQL] MySQL의 쿼리에서 UNION과 LIMIT 작업을 결합 (0) | 2020.04.02 |
[SQL] 특정 조건을 확인하기 위해 COALESCE를 사용하여 대 ISNULL을 사용하십니까? (0) | 2020.04.02 |