Как выполнить хранимую процедуру mssql с параметром вывода на pdo (драйвер odbc)?

Я использую драйвер ODBC (на хосте) и драйвер sqlsrv (на локальном компьютере) для PDO. Данные таблицы были успешно вставлены, но, я не обрабатываю выходной параметр, я попробовал это;

  1. $ query-> выборка (PDO :: FETCH_ASSOC);
  2. $ db-> query ("SELECT @Result") -> выборка (PDO :: FETCH_ASSOC);
  3. $ sp_result;

Хранимая процедура MSSQL:

ALTER PROCEDURE [dbo].[sp_Uye_Insert](
    --Uye 
    @Result varchar(250) OUTPUT,
    @Tckn nvarchar(11),
    @Adi nvarchar(50),
    @Soyadi nvarchar(50),
    @BabaAdi nvarchar(50),
    @AnaAdi nvarchar(50),
    @DogumTarihi date,
    @DogumYeri nvarchar(250),
    @Cinsiyet char(1),
    @OgrenimDurumId int,
    @KurumSicil nvarchar(50),
    @KadroUnvanId int,
    @Eposta nvarchar(250),
    @Telefon nvarchar(250),
    @KanGrubu nvarchar(50),
    @BransId int,
    @UyeDurumId int,
    @CreatedIpAdress nvarchar(50),
    @KayitFormu nvarchar(max),
    @CreatedUser int,

    -- UyeKurum
    @IlId int,
    @IlceId int,
    @KurumId int,
    @BirimId int,

    --UyeSosyalGuvenlik
    @SosyalGuvenlikKurumuId int,
    @SosyalGuvenlikSicilNumarasi int
)
AS
BEGIN

DECLARE @UyeId int 
DECLARE @KararNoId int
DECLARE @KararNo int
DECLARE @KayitNo int
DECLARE @UyeNo int
DECLARE @Date date
DECLARE @UyeHareketString nvarchar(max)

SET @Date = GETDATE()
SET @UyeHareketString = 'TCKN: '+@Tckn+',Adi:'+@Adi+',Soyadi:'+@Soyadi+',BabaAdi:'+@BabaAdi+',AnaAdi:'+@AnaAdi+',DogumTarihi:'+ CONVERT(VARCHAR, @DogumTarihi, 120)+',DogumYeri:'+@DogumYeri+',Cinsiyet:'+@Cinsiyet+',OgrenimDurumId:'+CONVERT(VARCHAR,@OgrenimDurumId,120)+',KurumSicil:'+@KurumSicil+',KadroUnvanId:'+CONVERT(VARCHAR,@KadroUnvanId,120)+',Eposta:'+@Eposta+',Telefon:'+@Telefon+',KanGrubu:'+@KanGrubu+',BransId:'+CONVERT(VARCHAR,@BransId,120)+',UyeDurumId:'+CONVERT(VARCHAR,@UyeDurumId,120)+',CreatedIpAdress:'+@CreatedIpAdress+',KayitFormu:'+@KayitFormu+',CreatedUser:'+CONVERT(VARCHAR,@CreatedUser,120)+',IlId:'+CONVERT(VARCHAR,@IlId,120)+',IlceId:'+CONVERT(VARCHAR,@IlceId,120)+',KurumId:'+CONVERT(VARCHAR,@KurumId,120)+',BirimId:'+CONVERT(VARCHAR,@BirimId,120)+',SosyalGuvenlikKurumuId:'+CONVERT(VARCHAR,@SosyalGuvenlikKurumuId,120)+',SosyalGuvenlikSicilNumarasi:'+CONVERT(VARCHAR,@SosyalGuvenlikSicilNumarasi,120);

BEGIN TRY
    BEGIN TRAN

        SET @KararNoId = (SELECT TOP 1 Id FROM KararNo ORDER BY Id DESC)
        SET @KararNo = (SELECT TOP 1 KararNo FROM KararNo ORDER BY Id DESC)
        INSERT INTO Uye (TCKN,Adi,Soyadi,BabaAdi,AnaAdi,DogumTarihi,DogumYeri,Cinsiyet,OgrenimDurumuId,Eposta,Telefon,KanGrubu,UyeDurumId,CreatedIpAdress,CreatedUser,CreatedDateTime) VALUES (
        @Tckn,@Adi,@Soyadi,@BabaAdi,@AnaAdi,@DogumTarihi,@DogumYeri,@Cinsiyet,@OgrenimDurumId,@Eposta,@Telefon,@KanGrubu,@UyeDurumId,@CreatedIpAdress,@CreatedUser,@Date);
        Set @UyeId = SCOPE_IDENTITY()
INSERT INTO UyeKayitNo (UyeId,UyeNo,KararNoId,UyelikBaslamaTarihi,UyeDurumId,KayitFormu,Aktif) VALUES (@UyeId,DEFAULT,@KararNoId,@Date,@UyeDurumId,@KayitFormu,1)
        SET @KayitNo = (SELECT UyeNo FROM UyeKayitNo WHERE UyeId=@UyeId AND Aktif = 1)

        INSERT INTO UyeKurum (UyeId,IlId,IlceId,KurumId,BirimId,KurumSicil,KadroUnvanId,BransId,BaslangicTarihi,Aktif) VALUES (@UyeId,@IlId,@IlceId,@KurumId,@BirimId,@KurumSicil,@KadroUnvanId,@BransId,@Date,1)

        INSERT INTO UyeSosyalGuvenlik (UyeId,SosyalGuvenlikKurumuId,SosyalGuvenlikSicilNumarasi,BaslangicTarihi,Aktif) VALUES (@UyeId,@SosyalGuvenlikKurumuId,@SosyalGuvenlikSicilNumarasi,@Date,1)


        INSERT INTO UyeHareket (UyeId,IslemYeri,UserId,HareketTarih,IlkDeger,SonDeger,Aciklama,Aktif) VALUES (@UyeId,'sp_Uye_Insert',@CreatedUser,@Date,NULL,@UyeHareketString,NULL,1)
        Set @Result = CONVERT(varchar(10),@UyeId)+','+CONVERT(varchar(10),@KayitNo)+','+CONVERT(varchar(10),@KararNo)
    COMMIT TRAN

END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

END 
GO

PHP:

$query = $db->prepare("EXEC  sp_Uye_Insert ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?");
    $query->bindParam(1,$sp_result,PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,  250);
    $query->bindValue(2,$TCKN,PDO::PARAM_STR);
    $query->bindValue(3,$Adi,PDO::PARAM_STR);
    $query->bindValue(4,$Soyadi,PDO::PARAM_STR);
    $query->bindValue(5,$BabaAdi,PDO::PARAM_STR);
    $query->bindValue(6,$AnaAdi,PDO::PARAM_STR);
    $query->bindValue(7,$DogumTarihi,PDO::PARAM_STR);
    $query->bindValue(8,$DogumYeri,PDO::PARAM_STR);
    $query->bindValue(9,$Cinsiyet, PDO::PARAM_STR);
    $query->bindValue(10,intval($OgrenimDurumId),PDO::PARAM_INT);
    $query->bindValue(11,$KurumSicil, PDO::PARAM_STR);
    $query->bindValue(12,intval($KadroUnvanId),PDO::PARAM_INT);
    $query->bindValue(13,$Eposta,PDO::PARAM_STR);
    $query->bindValue(14,$Telefon,PDO::PARAM_STR);
    $query->bindValue(15,$KanGrubu,PDO::PARAM_STR);
    $query->bindValue(16,intval($BransId),PDO::PARAM_INT);
    $query->bindValue(17,intval($UyeDurumId),PDO::PARAM_INT);
    $query->bindValue(18,$CreatedIpAdress,PDO::PARAM_STR);
    $query->bindValue(19,$KayitFormu,PDO::PARAM_STR);
    $query->bindValue(20,intval($CreatedUser),PDO::PARAM_INT);
    $query->bindValue(21,intval($IlId),PDO::PARAM_INT);
    $query->bindValue(22,intval($IlceId),PDO::PARAM_INT);
    $query->bindValue(23,intval($KurumId),PDO::PARAM_INT);
    $query->bindValue(24,intval($BirimId),PDO::PARAM_INT);
    $query->bindValue(25,intval($SigortaKurumu),PDO::PARAM_INT);
    $query->bindValue(26,intval($SSKNo),PDO::PARAM_INT);
if($query->execute()){
    echo json_encode(array(true,$query->fetch(PDO::FETCH_ASSOC)),$sp_result);
}else{
    echo json_encode(array(false, "Üye Kaydedilemedi.",$query->errorInfo());
}

Вы можете помочь мне ?

Есть 320 вопросов, уже содержащих «output», «parameter» и «pdo» - вы смотрели на любой из них для примера синтаксиса?

Aaron Bertrand 11.04.2018 13:50

Я видел и устал от большинства ответов

Eren Özkul 11.04.2018 13:57

Затем покажите, что вы пробовали, и любое полученное сообщение об ошибке.

Aaron Bertrand 11.04.2018 13:57

Например; если bindParam lenght 10, $ sp_result вернет мне "BHOSTVennaict.com". если длина bindParam 250, $ sp_result вернет мне значение null

Eren Özkul 11.04.2018 14:13

Я заменил длину bindParam на 25, вернул "\ u0000BHOST \ u0000V \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u000‌ 0 \ u0000 \ u0000 \ u0000 \ ‌ u0000 \ u0000 \ u0000 \ u0‌ 000 \ u0000 \ u0000 \ u000‌ 0 \ u0000 \ u0000 \ u0000 \ ‌ u0000 \ u0000 \ u0000 \ u0‌ 000 \ u0000 \ u0000 \ u000‌ 0 \ u0000 \ u0000 \ u0000 \ ‌ u0000 \ u0000 "

Eren Özkul 11.04.2018 14:19
1
5
527
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено, проблема с хранимой процедурой

Только добавить в sp;

SET NOCOUNT ON

Наконец SP:

ALTER PROCEDURE [dbo].[sp_Uye_Insert](
    --Uye 
    @Result varchar(250) OUTPUT,
    @Tckn nvarchar(11),
    @Adi nvarchar(50),
    @Soyadi nvarchar(50),
    @BabaAdi nvarchar(50),
    @AnaAdi nvarchar(50),
    @DogumTarihi date,
    @DogumYeri nvarchar(250),
    @Cinsiyet char(1),
    @OgrenimDurumId int,
    @KurumSicil nvarchar(50),
    @KadroUnvanId int,
    @Eposta nvarchar(250),
    @Telefon nvarchar(250),
    @KanGrubu nvarchar(50),
    @BransId int,
    @UyeDurumId int,
    @CreatedIpAdress nvarchar(50),
    @KayitFormu nvarchar(max),
    @CreatedUser int,

    -- UyeKurum
    @IlId int,
    @IlceId int,
    @KurumId int,
    @BirimId int,

    --UyeSosyalGuvenlik
    @SosyalGuvenlikKurumuId int,
    @SosyalGuvenlikSicilNumarasi int
)
AS
 SET NOCOUNT ON
BEGIN

DECLARE @UyeId int 
DECLARE @KararNoId int
DECLARE @KararNo int
DECLARE @KayitNo int
DECLARE @UyeNo int
DECLARE @Date date
DECLARE @UyeHareketString nvarchar(max)

SET @Date = GETDATE()
SET @UyeHareketString = 'TCKN: '+@Tckn+',Adi:'+@Adi+',Soyadi:'+@Soyadi+',BabaAdi:'+@BabaAdi+',AnaAdi:'+@AnaAdi+',DogumTarihi:'+ CONVERT(VARCHAR, @DogumTarihi, 120)+',DogumYeri:'+@DogumYeri+',Cinsiyet:'+@Cinsiyet+',OgrenimDurumId:'+CONVERT(VARCHAR,@OgrenimDurumId,120)+',KurumSicil:'+@KurumSicil+',KadroUnvanId:'+CONVERT(VARCHAR,@KadroUnvanId,120)+',Eposta:'+@Eposta+',Telefon:'+@Telefon+',KanGrubu:'+@KanGrubu+',BransId:'+CONVERT(VARCHAR,@BransId,120)+',UyeDurumId:'+CONVERT(VARCHAR,@UyeDurumId,120)+',CreatedIpAdress:'+@CreatedIpAdress+',KayitFormu:'+@KayitFormu+',CreatedUser:'+CONVERT(VARCHAR,@CreatedUser,120)+',IlId:'+CONVERT(VARCHAR,@IlId,120)+',IlceId:'+CONVERT(VARCHAR,@IlceId,120)+',KurumId:'+CONVERT(VARCHAR,@KurumId,120)+',BirimId:'+CONVERT(VARCHAR,@BirimId,120)+',SosyalGuvenlikKurumuId:'+CONVERT(VARCHAR,@SosyalGuvenlikKurumuId,120)+',SosyalGuvenlikSicilNumarasi:'+CONVERT(VARCHAR,@SosyalGuvenlikSicilNumarasi,120);

BEGIN TRY
    BEGIN TRAN

        SET @KararNoId = (SELECT TOP 1 Id FROM KararNo ORDER BY Id DESC)
        SET @KararNo = (SELECT TOP 1 KararNo FROM KararNo ORDER BY Id DESC)
        INSERT INTO Uye (TCKN,Adi,Soyadi,BabaAdi,AnaAdi,DogumTarihi,DogumYeri,Cinsiyet,OgrenimDurumuId,Eposta,Telefon,KanGrubu,UyeDurumId,CreatedIpAdress,CreatedUser,CreatedDateTime) VALUES (
        @Tckn,@Adi,@Soyadi,@BabaAdi,@AnaAdi,@DogumTarihi,@DogumYeri,@Cinsiyet,@OgrenimDurumId,@Eposta,@Telefon,@KanGrubu,@UyeDurumId,@CreatedIpAdress,@CreatedUser,@Date);
        Set @UyeId = SCOPE_IDENTITY()
INSERT INTO UyeKayitNo (UyeId,UyeNo,KararNoId,UyelikBaslamaTarihi,UyeDurumId,KayitFormu,Aktif) VALUES (@UyeId,DEFAULT,@KararNoId,@Date,@UyeDurumId,@KayitFormu,1)
        SET @KayitNo = (SELECT UyeNo FROM UyeKayitNo WHERE UyeId=@UyeId AND Aktif = 1)

        INSERT INTO UyeKurum (UyeId,IlId,IlceId,KurumId,BirimId,KurumSicil,KadroUnvanId,BransId,BaslangicTarihi,Aktif) VALUES (@UyeId,@IlId,@IlceId,@KurumId,@BirimId,@KurumSicil,@KadroUnvanId,@BransId,@Date,1)

        INSERT INTO UyeSosyalGuvenlik (UyeId,SosyalGuvenlikKurumuId,SosyalGuvenlikSicilNumarasi,BaslangicTarihi,Aktif) VALUES (@UyeId,@SosyalGuvenlikKurumuId,@SosyalGuvenlikSicilNumarasi,@Date,1)


        INSERT INTO UyeHareket (UyeId,IslemYeri,UserId,HareketTarih,IlkDeger,SonDeger,Aciklama,Aktif) VALUES (@UyeId,'sp_Uye_Insert',@CreatedUser,@Date,NULL,@UyeHareketString,NULL,1)
        Set @Result = CONVERT(varchar(10),@UyeId)+','+CONVERT(varchar(10),@KayitNo)+','+CONVERT(varchar(10),@KararNo)
    COMMIT TRAN

END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

END 
GO

Другие вопросы по теме