【问题标题】:Codeigniter with Temp Table SQL带有临时表 SQL 的 Codeigniter
【发布时间】:2016-09-23 07:12:46
【问题描述】:

我正在尝试使用Stored Procedure 创建一个查询。我能够创建它并且运行它时没有问题。这是我的存储过程

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 = ''+@Nip+'' 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

这就是我的运行方式

sp_penilaian '1500060'

结果如下

好的。问题是当我试图在 Codeigniter 中调用我的 SP 时。

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

然后我试图用这个检查我的数据

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

但我得到空数据。那么如何在 CodeIgniter 中使用临时表呢?或者如果我不能使用临时表,我可以创建表并将其放入我的存储过程中吗?

对不起,我的英语不好。

【问题讨论】:

  • 为什么存储过程如此复杂?您只需要最近更新的位置和日期/时间 - 只需通过查询即可获得。不需要临时表,不需要动态 sql。 #avoid-the-rbar
  • 好吧,我只是好奇为什么每个包含 # 表的 SP 都不起作用。我没有使用这个SP。我只是在我的 PHP 中编写了一个查询。

标签: sql sql-server codeigniter stored-procedures


【解决方案1】:

尝试在BEGIN 之后添加SET NOCOUNT ON;

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 = ''+@Nip+'' 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

【讨论】:

【解决方案2】:

看起来问题不在于实际的存储过程,而在于您调用它的方式。试试:

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

要将 nip 传递给存储过程,您可以使用 CodeIgniter 的数据库查询功能,如下所示:

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

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 2013-07-02
    • 2011-02-08
    • 2013-10-20
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多