2012-01-07 105 views
2

該存儲過程是否被視爲動態SQL或參數化查詢?動態SQL vs參數化查詢

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 
+0

爲了讓超級傻瓜sp更少,你可以添加一些驗證來確保@spname是'合法的'。 – MatBailie 2012-01-07 01:45:00

+0

這是我困惑的地方。由於超級dodgy只是使用參數,這可能是一個參數化查詢,在這種情況下,你不能注入SQL代碼。所以它根本就不狡猾,你不需要驗證。 – icc97 2012-01-07 01:52:07

+1

你不能用'EXEC @sp @ param'注入代碼。您只能提供對不同SP的引用。這是微妙的不同。我不完全同意dknaack的回答,所以我加了我自己的。我希望它可以幫助:) – MatBailie 2012-01-07 02:02:26

回答

1

「動態SQL」是指以編程方式構建SQL查詢字符串。如添加聯接,建立where子句等。

參數化查詢是包含變量的SQL查詢字符串,其值由SQL查詢字符串單獨提供。

您的示例都不符合這些描述,因爲它們都是存儲過程中的簡單T-SQL調用


它可能看起來迂腐,但如果你的應用程序調用'EXEC [dbo].[my_really_special_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_really_special_sp] @var1 @var2'是你的參數化查詢
  • @var1 = 1, @var2 = 10是你的參數


的重要的一點是你的例子是SP中的預編譯語句。我試圖解釋的示例是字符串,它們被傳遞給SQL Server以解析,編譯和執行。

如果該字符串是以編程方式逐個構成的,則它是動態sql。

如果該字符串包含單獨提供的變量引用,則它將被參數化。


我希望有幫助,但我可以看到它可能看起來很主觀。


至於你的編程風格。您的第二個SP存在輕微的「漏洞」,因爲如果用戶有權訪問它,即使該用戶本身不能正常訪問,他們也可以訪問具有相同簽名的所有其他SP。這可能是故意的,並且/或者您可以驗證@spname參數來關閉此漏洞。除此之外,我沒有看到任何可能存在的錯誤。

+0

輝煌,我喜歡迂腐,它解決了很多困惑:)這是迄今爲止最清晰的差異描述。 – icc97 2012-01-07 02:11:51

2
EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2; 

是不是參數化查詢,它是一個存儲的正常通話程序。

如果這將導致參數化查詢,則取決於[my_really_special_sp]的內容。

請提供更多信息,我想幫助你更多。

+0

感謝@dknaack,對於模糊不清,但我試圖弄清楚我的編程風格是否存在任何嚴重問題。一般my_really_special_sp會像'UPDATE [my_table] SET [field1] = @ varchar1 WHERE [field2] = @ varchar2' – icc97 2012-01-07 01:24:06

+0

我有一個版本的工作是和沒有操縱。是'UPDATE [my_table] SET [field1] = @ varchar1 WHERE [field2] = @ varchar2'參數化查詢? – icc97 2012-01-07 01:34:18

+0

你應該使用第一種方法,以獲得更好的可讀性,更好的測試和最重要的事情......更少的調用(更好的性能)。 – dknaack 2012-01-07 01:37:06