2017-08-08 403 views
-1

内使用变量我有以下SQL..What我试图做的是使用在动态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

你的表名是单个字符? –

+1

[表名作为变量]的可能重复(https://stackoverflow.com/questions/2838490/表 - 名 - 变量) –

回答

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