2017-08-08 5 views
-1

内の変数を使用すると、動的SQL内のストアドプロシージャ・レベルで定義されたパラメータを使用している:私は私がやろうとしています以下のSQL..Whatを持って、動的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文字ですか? –

+1

[テーブル名を変数として使用](https://stackoverflow.com/questions/2838490/table-name-as-variable) –

答えて

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 
関連する問題