动态SQL与参数化查询

动态SQL与参数化查询,sql,stored-procedures,dynamic-sql,Sql,Stored Procedures,Dynamic Sql,此存储过程被视为动态SQL还是参数化查询 CREATE PROCEDURE [dbo].[my_dodgy_sp] @varchar1 varchar(50), @varchar2 varchar(50) AS BEGIN ... EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2; END 如果您能告诉我这是否是动态/参数化的,请在顶部添加樱桃巧克力甜甜圈: CREATE PROCEDURE [dbo]

此存储过程被视为动态SQL还是参数化查询

CREATE PROCEDURE [dbo].[my_dodgy_sp]
    @varchar1 varchar(50),
    @varchar2 varchar(50)
AS
BEGIN
    ...

    EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2;
END
如果您能告诉我这是否是动态/参数化的,请在顶部添加樱桃巧克力甜甜圈:

CREATE PROCEDURE [dbo].[my_super_dodgy_sp]
    @varchar1 varchar(50),
    @varchar2 varchar(50),
    @stored_procedure_name sysname
AS
BEGIN
    ...

    EXEC @stored_procedure_name @varchar1 @varchar2;
END
不是参数化查询,而是存储过程的正常调用

如果这将导致参数化查询,这取决于
[my\u really\u special\u sp]
的内容

请提供更多信息,我想为您提供更多帮助。

“动态SQL”指以编程方式构建SQL查询字符串。例如添加联接、构建where子句等

参数化查询是包含变量的SQL查询字符串,其值与SQL查询字符串分开提供

这两个示例都不符合这些描述,因为它们都是存储过程中的简单T-SQL调用


这可能看起来很迂腐,但如果应用程序调用
'EXEC[dbo].[my\u really\u special\u sp]@varchar1@varchar2'
,那么这就是一个参数化查询

如果您的SP调用
SP_executesql'EXEC[dbo].[my_really_special_SP]@var1@var2',@var1=1,@var2=10
,那么

  • sp_executesql
    是T-SQL调用
  • 'EXEC[dbo].[my\u really\u special\u sp]@var1@var2'
    是您的参数化查询
  • @var1=1、@var2=10
    是您的参数

重要的一点是,您的示例是SP中的预编译语句。我试图解释的示例是传递给SQL Server以进行解析、编译和执行的字符串

如果该字符串是通过编程逐段组成的,那么它就是动态sql

如果该字符串包含单独提供的变量引用,则会将其参数化


我希望这会有所帮助,尽管我可以看出这似乎是主观的



至于你的编程风格。您的第二个SP存在一个较小的“漏洞”,即如果用户有权访问该SP,则他们可以访问具有相同签名的所有其他SP,即使该用户本机通常没有访问权限。这可能是故意的,和/或您可以验证@spname参数以关闭漏洞。除此之外,我看不出任何错误。

谢谢@dknaack,很抱歉说得含糊不清,但我正试图弄清楚我的编程风格是否存在任何严重问题。通常情况下,我的_really_special_sp类似于
UPDATE[my_table]SET[field1]=@varchar1,其中[field2]=@varchar2
我有一个版本可以工作是的,没有操作。
UPDATE[my_table]SET[field1]=@varchar1,其中[field2]=@varchar2
是一个参数化查询吗?您应该使用第一种方法以获得更好的可读性、更好的测试和最重要的事情。。。更少的呼叫(更好的性能)。是的,我有,99%的时间。但是我仍然很困惑我之前评论中的
UPDATE
语句是否被认为是“参数化的”。假设我理解你的意思;)
UPDATE[my_table]SET[field1]=@varchar1,其中[field2]=@varchar2
是参数化的。要使超级狡猾的sp不那么狡猾,您可以添加一些验证以确保@spname是“合法的”。这就是我感到困惑的地方。因为super Dodge只是使用参数,所以这可能是一个参数化查询,在这种情况下,您不能插入SQL代码。因此,它一点也不狡猾,您不需要验证。您不能使用
EXEC@sp@param
注入代码。您只能提供对另一个SP的引用,这与SP有细微的不同。我不太同意dknaack的答案,所以我添加了我自己的答案。我希望这会有帮助:)太好了——这回答了我想问的实际问题。但我会离开,尝试一些我自己的SQL注入来确认。我添加了一个针对sys.procedures的检查(如您的第一条评论中所述),但只是为了防止SQL注入!才华横溢,我喜欢迂腐,它解决了很多困惑:)这是迄今为止最清晰的区别描述。
EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2;