在动态SQL中使用变量

时间:2017-08-08 16:10:23

标签: sql sql-server

我有以下SQL ..我想要做的是使用动态SQL中存储过程级别定义的参数:

CREATE PROCEDURE [dbo].[Test] 
    (@DealID NVARCHAR(500),
     @OUTPUT NVARCHAR(MAX) OUTPUT,    
     @FeeType CHAR(1)
    )  --  I want to use this parameter inside dynamic SQL query
AS    
    DECLARE @exec_str NVARCHAR(MAX)
    DECLARE @ParmDefinition NVARCHAR(MAX)
BEGIN
    SET @exec_str = N'DECLARE @ParmDefinition NVARCHAR(500)
                      SELECT * FROM @FeeType'    --This is where I want to use the variable

    DECLARE @ParamDefinition nvarchar(max)
    SET @ParamDefinition = N'@OUTPUT NVARCHAR(MAX) OUTPUT'

    EXEC sp_executesql @exec_str, @ParamDefinition

有人可以告诉我该怎么做吗?

由于

1 个答案:

答案 0 :(得分:3)

在SQL Server中,标识符无法参数化 由于您仍在使用动态SQL,因此可以执行以下操作:

SET @exec_str= N'Select * from '+ @FeeType 

EXEC(@exec_str)

但是,这很容易受到SQL injection攻击。为了将风险降至最低,您应该首先检查这样的表名是否存在,并且我还要使用quotename只是为了安全起见:

IF EXISTS
(
    SELECT 1
    FROM Information_Schema.Tables
    WHERE TABLE_NAME = @FeeType
)
BEGIN
    SET @exec_str= N'Select * from '+ QUOTENAME(@FeeType)
    EXEC(@exec_str)
END