2016-09-23 12 views
1

Stored Procedureでクエリを作成しようとしています。私はそれを作成することができ、それを実行するときに問題はありません。ここで私のStoredProcedureが、これは私がここテンポラリテーブルのCodeigniter SQL

sp_penilaian '1500060' 

それを実行し、どのように

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE SP_Penilaian 
    @Nip varchar(50) 
AS 
BEGIN 

    select * INTO #tMP from historyposition where nip = ''[email protected]+'' order by approveddate desc 

declare @NewPosition varchar(50), @NewPositionLast varchar(50), @ApproveDate datetime, @ApproveDateLast datetime 
select top 1 @NewPositionLast = NewPosition, @ApproveDateLast=ApprovedDate from #tmp 
WHILE EXISTS (SELECT * FROM #tMP) 
BEGIN 
    select top 1 @NewPosition = NewPosition, @ApproveDate=ApprovedDate from #tmp 
    if (@NewPosition = @NewPositionLast) 
    begin 
     set @NewPositionLast = @NewPosition 
     set @ApproveDateLast = @ApproveDate 
    end 
    else 
    begin 
     break 
    end 
    delete top(1) #tMP 
END 
select @NewPositionLast 'LatesUpgradePosition' , @ApproveDateLast 'LatesUpgradeDate' 
END 
GO 

であることresullt

enter image description here

OKです。問題は私がCodeigniterで私のSPに電話をかけようとしているときです。

$nip = '1500060'; 
$filt_outlet = $this->db->query("SP_Penilaian '".$nip."'")->row(); 

、その後、私はこの

echo "<pre>".print_r($filt_outlet)."</pre>"; 

と私のデータをチェックするが、私は空のデータを取得しようとしています。では、CodeIgniterで一時テーブルを使用する方法は?または私は一時テーブルを使用することはできません私はちょうどテーブルを作成し、私のストアドプロシージャにドロップすることはできますか?

私の悪い英語のために申し訳ありません。

+0

なぜすべての複雑後SET NOCOUNT ON;を追加してみてくださいそのストアドプロシージャの?あなたはちょうどその最新の位置と日付/時刻を更新したいだけです。ちょうどそれをクエリで取得してください。一時テーブルは必要なく、動的SQLは必要ありません。 #avoid-the-rbar –

+0

まあ、なぜ '#'テーブルを含むすべてのSPが動作しないのか不思議です。私はこのSPを使用していません。私はPHPの中にクエリを書くだけです。 – YVS1102

答えて

3

BEGIN

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE SP_Penilaian 
    @Nip varchar(50) 
AS 
BEGIN 

SET NOCOUNT ON; /*<--Add here*/ 

    select * INTO #tMP from historyposition where nip = ''[email protected]+'' order by approveddate desc 

declare @NewPosition varchar(50), @NewPositionLast varchar(50), @ApproveDate datetime, @ApproveDateLast datetime 
select top 1 @NewPositionLast = NewPosition, @ApproveDateLast=ApprovedDate from #tmp 
WHILE EXISTS (SELECT * FROM #tMP) 
BEGIN 
    select top 1 @NewPosition = NewPosition, @ApproveDate=ApprovedDate from #tmp 
    if (@NewPosition = @NewPositionLast) 
    begin 
     set @NewPositionLast = @NewPosition 
     set @ApproveDateLast = @ApproveDate 
    end 
    else 
    begin 
     break 
    end 
    delete top(1) #tMP 
END 
select @NewPositionLast 'LatesUpgradePosition' , @ApproveDateLast 'LatesUpgradeDate' 
END 
GO 
+0

それは私の問題を解決しました。しかし、なぜ私は 'SET NOCOUNT ON;'が必要なのですか? – YVS1102

+0

ここから学んだ[link] http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/ –

0

実際のストアドプロシージャに問題があるように見えるのではなく、呼び出す方法がわかります。

$nip = '1500060'; 
$sp = "CALL SP_Penilaian(?)"; 

そして、あなたがそうのようなCodeIgniterのデータベースクエリの目的球を使用することができますストアドプロシージャにニップを渡すために:試してみてください

$filt_outlet = $this->db->query($sp, array('nip'=>$nip));