如何退出 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
我在 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