我有以下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
有人可以告诉我该怎么做吗?
由于
答案 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