2013-03-04 59 views
0

在這裏,我想創建一個動態查詢,但它給錯誤:如何在exec('')中編寫此查詢?

CREATE PROCEDURE SP_GetProductsbySales12 
@top int, 
@all bit, 
@orderby nvarchar(20), 
@orderdir nvarchar(30) 
as 
begin 

declare @sql nvarchar(2000) 

set @sql = ('SELECT a.skucode,a.productCode,a.productName,a.totalOrder FROM 
    (select top ')+cast(@top as nvarchar(50))+(' tblProducts.skuCode,tblProducts.productCode, tblProducts.productName, COUNT(tblOrders_Products.delivered) as totalOrder 
FROM   tblOrders_Products INNER JOIN 
         tblProducts ON tblOrders_Products.productID = tblProducts.productID 
WHERE tblProducts.productName is not null 
GROUP BY tblOrders_Products.delivered, tblOrders_Products.productID, tblProducts.skuCode, tblProducts.productName,tblProducts.productCode 
ORDER BY totalOrder desc,tblProducts.skuCode ) a 
ORDER BY case when @orderdir = ''a'' and @orderby=''skucode'' then a.skuCode end , 
      case when @orderdir = ''d'' and @orderby=''skucode'' then a.skuCode end desc, 

      case when @orderdir = ''a'' and @orderby=''qty'' then a.totalOrder end, 
      case when @orderdir = ''a'' and @orderby=''qty'' then a.skuCode end, 
      case when @orderdir = ''d'' and @orderby=''qty'' then a.totalOrder end desc, 
      case when @orderdir = ''d'' and @orderby=''qty'' then a.skuCode end desc') 
exec (@sql) 


end 
GO 

我得到的錯誤是

服務器:消息137,級別15,狀態2,8號線 必須聲明變量'@orderdir'。

即使@orderdir被聲明,爲什麼我得到這個?

回答

4

使用sp_executesql來傳入您的變量。

http://msdn.microsoft.com/en-us/library/ms188001.aspx

exec sp_executesql @sql, 
        N'@orderdir nvarchar(30)', 
        @[email protected] 
+0

+1。我在想什麼?我試圖把它簡單地用於海報,但當然這是做到這一點的方法。 – 2013-03-04 05:24:11

+0

謝謝!如果你想要動態的對象名稱,你的方式是最好的。避免SQL注入的一個好方法是將其包裝在'QUOTENAME()'函數中。 – pyrospade 2013-03-04 05:26:38

+0

確實。我用過很多次。 – 2013-03-04 05:27:12