2011-07-12 165 views
0

爲什麼動態SQL不起作用?爲什麼動態SQL不起作用

代碼在C#:

this.DataAccess.AddParametr("@where","WHERE ta.IdMoinRef in(112,113,115)"); 

代碼SQLSERVER:

ALTER Procedure [dbo].[sp_tblAsnad_SelectAllForReport] 
@where nvarchar(max) 
As 
Begin          
Select 
     ta.IdMoinRef, 
     ta.IdTafzeliRef, 
     ta.ShHesab, 
     ta.Bd, 
     ta.Bs, 
     ta.ShSnd, 
     ta.AtfSnd, 
     ta.DateSnd, 
     mo.Hmoin, 
     co.Hcol, 
     gr.Hgroup, 
     co.IdGroupRef, 
     mo.IdColRef 
    From tblAsnad as ta 
    inner join tblMoin as mo on ta.IdMoinRef=mo.IdMoin 
    inner join tblCol as co on mo.IdColRef=co.IdCol 
    inner join tblGroup as gr on co.IdGroupRef=gr.IdGroup 
    exec(@where) 
End 

回答

4

你困惑。你需要將你的整個語句封裝到一個命令中。您正試圖執行一個查詢,然後再執行一個附加查詢。您需要將您的主要查詢與您的參數一起解析,例如

DECLARE @sql VARCHAR(1000) 
SET @sql = "SELECT ... " + @where -- Your full query. 
exec(@sql) 
+0

我應該怎麼做 – jackStonre

+0

@jackStone正是如上所述,省略了......你真正的SELECT查詢。 –

+0

最佳答案。謝謝 – jackStonre

2

您需要將整個查詢作爲一個字符串執行,而不僅僅是WHERE子句。

-1

您的代碼將WHERE字符串作爲字符串參數傳遞。所以你的proc將執行的將是:

ALTER Procedure [dbo].[sp_tblAsnad_SelectAllForReport] 
@where nvarchar(max) 
As 
Begin          
Select 
     ta.IdMoinRef, 
     ta.IdTafzeliRef, 
     ta.ShHesab, 
     ta.Bd, 
     ta.Bs, 
     ta.ShSnd, 
     ta.AtfSnd, 
     ta.DateSnd, 
     mo.Hmoin, 
     co.Hcol, 
     gr.Hgroup, 
     co.IdGroupRef, 
     mo.IdColRef 
    From tblAsnad as ta 
    inner join tblMoin as mo on ta.IdMoinRef=mo.IdMoin 
    inner join tblCol as co on mo.IdColRef=co.IdCol 
    inner join tblGroup as gr on co.IdGroupRef=gr.IdGroup 
    exec('WHERE ta.IdMoinRef in(112,113,115)') 
End 

其中,顯然是錯誤的。你的整個命令需要在這裏的命令文本中。

+0

應該是動態的,而不是靜態的。你的代碼是一個靜態的 – jackStonre

+0

我只是指出AS IS的代碼是如何在DBMS上執行的,因此它爲什麼不起作用。這是個問題。 – jaywayco

3

您試圖只執行where子句。對於動態SQL語句時,必須建立整個語句作爲字符串:

  @s = "select * from T " + @where_clause 
      exec(@s) 
相關問題