如何退出 PDW 中的存储过程

How to exit a stored procedure in PDW

我在 PDW AU5 工作。我正在编写一个需要动态 SQL 的存储过程(因为数据库名称可变)。因此,为了防止 SQL 注入,我对存储过程的输入参数值进行了简单测试。如果测试失败,我想退出存储过程。通常在 SMP 上,我会使用 RETURN -1 来执行此操作。但是,PDW 上的存储过程中不允许使用 RETURN。我该如何解决这个问题?

您需要将代码围绕 IF 语句包装起来,并且在它应该是 RETURNed 的部分中,只需确保 IF 条件是' t 满足,整个代码块被绕过并进入存储过程的末尾。

例如

CREATE PROCEDURE dbo.uspDynamicSQL
( @UserField varchar(255) )
AS

IF CHARINDEX(@UserField) > 0 THEN
BEGIN

-- YOUR SQL CODE AS NORMAL

END;

虽然不漂亮,但很管用。

您可以尝试使用 QUOTENAME 函数对输入字符串中的单引号字符进行转义,以阻止动态 SQL 注入。

DECLARE @userfield VARCHAR(255) = 'abc'' ;SELECT 1; '
DECLARE @sql NVARCHAR(4000)

SET @sql = 'SELECT ' + QUOTENAME(@UserField, '''')

PRINT @sql

EXEC (@sql)

查看另一个 post 关于如何防止 SQL 注入 how to prevent SQL Injection