none
Stored Prodecure ve UDF Hakkinda yardim RRS feed

  • Soru

  • C# Asp.Net ile calisan web form üzerindeki Gridview da goruntulenmek uzere asagidaki gibi bir sorgu calistirmam gerekiyor SSMM da Query Page de sorguyu ilk calistirmada

    Could not find stored procedure '##sp_Banka'. hatasi aliyorum ancak 2c. calistirmada bu hata gelmiyor sebebi ne olabilir ? ayrica bu SP nin urettigi tmp table verisini Gridviewda nasil kullanirim? yada SP yerine UDF mi kullanmam daha pratik ve kolay olur ? select * from udf_banka(N'2013-01-02') gibi...

    Tesekkurler.

    use scsn102100113
    EXEC ##sp_Banka N'2013-01-02'
     
    IF OBJECT_ID('tempdb..##sp_Banka') IS NOT NULL
    DROP PROCEDURE ##sp_Banka
    GO
    
    CREATE PROCEDURE ##sp_Banka (@tarih datetime)
     
    AS
    BEGIN
    SET NOCOUNT ON
    --set @tarih = '2013-01-03'
     
    DECLARE @tmptable TABLE (ISLEMTARIH datetime, CARINO varchar(15),BANKA varchar(50),ACIKLAMA varchar(50),GIREN money,CIKAN money,KALAN_DEVIR money)
     
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR)
    SELECT T1.ISLEMTARIH,'' as CARINO,'' as BANKA,'Devir' as ACIKLAMA,
    0 as GIREN,0 as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih-1
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR) 
    SELECT T1.ISLEMTARIH,T1.CARINO,T2.FIRMA AS BANKA,T1.ACIK as ACIKLAMA,
    SUM(T1.BORC) as GIREN,sum(T1.ALACAK) as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    SELECT * FROM @tmptable
     
    SET NOCOUNT OFF
     
    END



    10 Ocak 2014 Cuma 13:22

Yanıtlar

  • En üstteki kodu en alta koyarsan problem olmaz

    İlk çalıştırmada henüz SP yok iken çağırıyorsun, ona kızıyor.

    Daha sonar IF EXISTS ile varsa once DROP ediyorsun. Arkasından CREATE ile oluşturuyorsun.

    İkinci kez çalıştırdığında, SP sistemde bir önceki çalıştırmadan dolayı varolduğu için problemsiz çalışıyor.

    Aşağıdaki gibi yaparsan problem olmaz

     
    IF OBJECT_ID('tempdb..##sp_Banka') IS NOT NULL
    DROP PROCEDURE ##sp_Banka
    GO
    
    CREATE PROCEDURE ##sp_Banka (@tarih datetime)
     
    AS
    BEGIN
    SET NOCOUNT ON
    --set @tarih = '2013-01-03'
     
    DECLARE @tmptable TABLE (ISLEMTARIH datetime, CARINO varchar(15),BANKA varchar(50),ACIKLAMA varchar(50),GIREN money,CIKAN money,KALAN_DEVIR money)
     
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR)
    SELECT T1.ISLEMTARIH,'' as CARINO,'' as BANKA,'Devir' as ACIKLAMA,
    0 as GIREN,0 as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih-1
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR) 
    SELECT T1.ISLEMTARIH,T1.CARINO,T2.FIRMA AS BANKA,T1.ACIK as ACIKLAMA,
    SUM(T1.BORC) as GIREN,sum(T1.ALACAK) as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    SELECT * FROM @tmptable
     
    SET NOCOUNT OFF
     
    END
    GO
    
    EXEC ##sp_Banka N'2013-01-02'
    

    NOT: ilk kez SP'lerin ## ile isimlendirildiğini gördüm :)


    SQL Server, SQL Server 2012 Denali and T-SQL Tutorials

    • Yanıt Olarak İşaretleyen Soykan OZCELIK 13 Ocak 2014 Pazartesi 14:34
    10 Ocak 2014 Cuma 13:43
  • Soykan,

    Dedigim gibi oncelikle bunu global temp yapma. Function olsaydi sunun gibi olacakti:

    CREATE FUNCTION fnBanka ( @tarih DATETIME )
    RETURNS @tmpTable TABLE
        (
          ISLEMTARIH DATETIME, CARINO VARCHAR(15),  BANKA VARCHAR(50) ,   
    	  ACIKLAMA VARCHAR(50), GIREN MONEY, CIKAN MONEY, KALAN_DEVIR MONEY
        )
    AS 
        BEGIN
            INSERT  INTO @tmptable
                    ( ISLEMTARIH, CARINO, BANKA, ACIKLAMA, GIREN, CIKAN, KALAN_DEVIR )
                    SELECT  T1.ISLEMTARIH ,
                            '' AS CARINO ,
                            '' AS BANKA ,
                            'Devir' AS ACIKLAMA ,
                            0 AS GIREN ,
                            0 AS CIKAN ,
                            SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
                    FROM    carikart T1
                            INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
                    WHERE   T2.CARITIP = 'B'
                            AND T1.ISLEMTARIH = @tarih - 1
                    GROUP BY T1.ISLEMTARIH ,
                            T2.FIRMA ,
                            T1.CARINO ,
                            T1.ACIK;
     
            INSERT  INTO @tmptable
                    ( ISLEMTARIH, CARINO, BANKA, ACIKLAMA, GIREN, CIKAN, KALAN_DEVIR )
                    SELECT  T1.ISLEMTARIH ,
                            T1.CARINO ,
                            T2.FIRMA AS BANKA ,
                            T1.ACIK AS ACIKLAMA ,
                            SUM(T1.BORC) AS GIREN ,
                            SUM(T1.ALACAK) AS CIKAN ,
                            SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
                    FROM    carikart T1
                            INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
                    WHERE   T2.CARITIP = 'B'
                            AND T1.ISLEMTARIH = @tarih
                    GROUP BY T1.ISLEMTARIH ,
                            T2.FIRMA ,
                            T1.CARINO ,
                            T1.ACIK; 
            RETURN;	
        END
    

    Ya da daha kisaltilmis hali:

    CREATE FUNCTION fnBanka ( @tarih DATETIME )
    RETURNS TABLE
    AS 
      RETURN
    (
       SELECT  T1.ISLEMTARIH,  T1.CARINO,  T2.FIRMA AS BANKA, T1.ACIK AS ACIKLAMA,
    	SUM(T1.BORC) AS GIREN,
        SUM(T1.ALACAK) AS CIKAN ,
        SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
       FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
       WHERE   T2.CARITIP = 'B' AND T1.ISLEMTARIH = @tarih 
       GROUP BY T1.ISLEMTARIH, T2.FIRMA, T1.CARINO, T1.ACIK
       UNION ALL 
       SELECT  T1.ISLEMTARIH, '' AS CARINO, '' AS BANKA, 'Devir' AS ACIKLAMA,
        0 AS GIREN, 0 AS CIKAN,  
    	SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
        FROM    carikart T1 INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
        WHERE T2.CARITIP = 'B' AND T1.ISLEMTARIH = @tarih - 1
        GROUP BY T1.ISLEMTARIH, T2.FIRMA, T1.CARINO, T1.ACIK;
    )

    Function olunca:

    Select * from fnBanka('2013-01-03')

    gibi kullanabilirsin. Ikinci koda bakinca hic SP ya da function yapmadan dinamik SQL kullansan da olur.


    • Yanıt Olarak İşaretleyen Soykan OZCELIK 13 Ocak 2014 Pazartesi 14:34
    13 Ocak 2014 Pazartesi 14:23

Tüm Yanıtlar

  • En üstteki kodu en alta koyarsan problem olmaz

    İlk çalıştırmada henüz SP yok iken çağırıyorsun, ona kızıyor.

    Daha sonar IF EXISTS ile varsa once DROP ediyorsun. Arkasından CREATE ile oluşturuyorsun.

    İkinci kez çalıştırdığında, SP sistemde bir önceki çalıştırmadan dolayı varolduğu için problemsiz çalışıyor.

    Aşağıdaki gibi yaparsan problem olmaz

     
    IF OBJECT_ID('tempdb..##sp_Banka') IS NOT NULL
    DROP PROCEDURE ##sp_Banka
    GO
    
    CREATE PROCEDURE ##sp_Banka (@tarih datetime)
     
    AS
    BEGIN
    SET NOCOUNT ON
    --set @tarih = '2013-01-03'
     
    DECLARE @tmptable TABLE (ISLEMTARIH datetime, CARINO varchar(15),BANKA varchar(50),ACIKLAMA varchar(50),GIREN money,CIKAN money,KALAN_DEVIR money)
     
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR)
    SELECT T1.ISLEMTARIH,'' as CARINO,'' as BANKA,'Devir' as ACIKLAMA,
    0 as GIREN,0 as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih-1
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    INSERT INTO @tmptable(ISLEMTARIH,CARINO,BANKA,ACIKLAMA,GIREN,CIKAN,KALAN_DEVIR) 
    SELECT T1.ISLEMTARIH,T1.CARINO,T2.FIRMA AS BANKA,T1.ACIK as ACIKLAMA,
    SUM(T1.BORC) as GIREN,sum(T1.ALACAK) as CIKAN,
    SUM(T1.BORC-T1.ALACAK) as KALAN_DEVIR
    FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO=t2.CARINO
    WHERE T2.CARITIP='B' AND T1.ISLEMTARIH=@tarih
    GROUP BY T1.ISLEMTARIH,T2.FIRMA,T1.CARINO,T1.ACIK 
     
    SELECT * FROM @tmptable
     
    SET NOCOUNT OFF
     
    END
    GO
    
    EXEC ##sp_Banka N'2013-01-02'
    

    NOT: ilk kez SP'lerin ## ile isimlendirildiğini gördüm :)


    SQL Server, SQL Server 2012 Denali and T-SQL Tutorials

    • Yanıt Olarak İşaretleyen Soykan OZCELIK 13 Ocak 2014 Pazartesi 14:34
    10 Ocak 2014 Cuma 13:43
  • Tesekkur evet sorunsuz calisti :)

    ## temp SP yaratirken kullaniliyor

    bu sorguyu Gridview de kullanabilmek ile ilgili bir oneriniz varmi ?

    ayrica bu kodu Function yani UDF olarak modifiye etsem nasil bir sey olmali

    bu amac icin SP mi UDF mi sizce ?

    10 Ocak 2014 Cuma 13:49
  • Soykan, Merhaba.. Proceduru olusturmadan cagırmıssın.. Ancak bu ıslemde problem var. - procedure oluşturacaksan global temp prosedür yapma, multi userda sorun çıkar - prosedür yerine function daha efektif görünüyor - bu prosedürün tamamını dinamik sql olarak kullanabilirsin Sanal klavyede fazla yazamıyorum; telefon ile arayacağım
    10 Ocak 2014 Cuma 20:21
  • Merhaba ustad,

    bir onceki yanitta arkadasin onerisi ile duzelttigim sekilde calisiyor ancak dedigin gibi function olmasi daha efektif sanki

    bu kodu function yapisina donusturelim merak ettim :)

    ayrica bir soru daha function da birden fazla parameter input varmi orn. 2 tarih arasi stok hareketi sorguladigin bir function oldugunu dusunelim mesela.
    10 Ocak 2014 Cuma 20:56
  • Soykan,

    Dedigim gibi oncelikle bunu global temp yapma. Function olsaydi sunun gibi olacakti:

    CREATE FUNCTION fnBanka ( @tarih DATETIME )
    RETURNS @tmpTable TABLE
        (
          ISLEMTARIH DATETIME, CARINO VARCHAR(15),  BANKA VARCHAR(50) ,   
    	  ACIKLAMA VARCHAR(50), GIREN MONEY, CIKAN MONEY, KALAN_DEVIR MONEY
        )
    AS 
        BEGIN
            INSERT  INTO @tmptable
                    ( ISLEMTARIH, CARINO, BANKA, ACIKLAMA, GIREN, CIKAN, KALAN_DEVIR )
                    SELECT  T1.ISLEMTARIH ,
                            '' AS CARINO ,
                            '' AS BANKA ,
                            'Devir' AS ACIKLAMA ,
                            0 AS GIREN ,
                            0 AS CIKAN ,
                            SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
                    FROM    carikart T1
                            INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
                    WHERE   T2.CARITIP = 'B'
                            AND T1.ISLEMTARIH = @tarih - 1
                    GROUP BY T1.ISLEMTARIH ,
                            T2.FIRMA ,
                            T1.CARINO ,
                            T1.ACIK;
     
            INSERT  INTO @tmptable
                    ( ISLEMTARIH, CARINO, BANKA, ACIKLAMA, GIREN, CIKAN, KALAN_DEVIR )
                    SELECT  T1.ISLEMTARIH ,
                            T1.CARINO ,
                            T2.FIRMA AS BANKA ,
                            T1.ACIK AS ACIKLAMA ,
                            SUM(T1.BORC) AS GIREN ,
                            SUM(T1.ALACAK) AS CIKAN ,
                            SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
                    FROM    carikart T1
                            INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
                    WHERE   T2.CARITIP = 'B'
                            AND T1.ISLEMTARIH = @tarih
                    GROUP BY T1.ISLEMTARIH ,
                            T2.FIRMA ,
                            T1.CARINO ,
                            T1.ACIK; 
            RETURN;	
        END
    

    Ya da daha kisaltilmis hali:

    CREATE FUNCTION fnBanka ( @tarih DATETIME )
    RETURNS TABLE
    AS 
      RETURN
    (
       SELECT  T1.ISLEMTARIH,  T1.CARINO,  T2.FIRMA AS BANKA, T1.ACIK AS ACIKLAMA,
    	SUM(T1.BORC) AS GIREN,
        SUM(T1.ALACAK) AS CIKAN ,
        SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
       FROM carikart T1 INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
       WHERE   T2.CARITIP = 'B' AND T1.ISLEMTARIH = @tarih 
       GROUP BY T1.ISLEMTARIH, T2.FIRMA, T1.CARINO, T1.ACIK
       UNION ALL 
       SELECT  T1.ISLEMTARIH, '' AS CARINO, '' AS BANKA, 'Devir' AS ACIKLAMA,
        0 AS GIREN, 0 AS CIKAN,  
    	SUM(T1.BORC - T1.ALACAK) AS KALAN_DEVIR
        FROM    carikart T1 INNER JOIN musbil T2 ON T1.CARINO = t2.CARINO
        WHERE T2.CARITIP = 'B' AND T1.ISLEMTARIH = @tarih - 1
        GROUP BY T1.ISLEMTARIH, T2.FIRMA, T1.CARINO, T1.ACIK;
    )

    Function olunca:

    Select * from fnBanka('2013-01-03')

    gibi kullanabilirsin. Ikinci koda bakinca hic SP ya da function yapmadan dinamik SQL kullansan da olur.


    • Yanıt Olarak İşaretleyen Soykan OZCELIK 13 Ocak 2014 Pazartesi 14:34
    13 Ocak 2014 Pazartesi 14:23
  • ustad tesekkur,

    Select * from fnBanka('2013-01-03','2013-01-20') gibi bir kullanim mumkunmu ?

    yani tarih aralikli bir sorgulama yapabilme

    13 Ocak 2014 Pazartesi 14:27
  • Evet ama o zaman function'in degistirmen lazim (2 parameter alacak:)
    13 Ocak 2014 Pazartesi 14:29
  • ok function alrin tek input kabul ettigi gibi bir yanlis bilgi kalmis aklimda :(

    dogrusu multiple input single output olsa gerek :)

    13 Ocak 2014 Pazartesi 14:32