+ Yanıtla
Sayfa Düzeni: 2 / 2
İlkİlk 1 2
Toplam 17 sonuçtan 11 ile 17 arası olanlar

Konu Başlığı: ASP ile store procedure & birden fazla select

  1. #11
    olaya tam hakim olamadığım için söylediklerinizi de tam olarak anlayamadım sanırım en iyisi bildiğimiz ASP ile kayıt seti içerisindeki sonuçları döngüye sokup tekrar her bir veri için recordset açmak olacak. her ne kadar performanslı olmasada çözüm yolu bu gibi gözüküyor.

  2. #12
    Mesajınızı tekrar okudukta sonra denemeye karar verdim ve detayların veri desenini aynı hale getirdim. Daha sonra bunları geçici tabloya aktardım ve bu geçici tabloyu okutttum. Herhangi bir sorun olmadı.

    İlk selecti döngüye sokmak istiyorum ki list_id devamlı değişsin ve detaylar da doğal olarak değişsin ancak while döngüsünü sanırım kuramadım.

    Sayaç için bir değişken yarattım ve değişken kendini devamlı bir arttırıyor ta ki tabloda bulunan veri sayısına ulaşana kadar. Ancak SP'yi çalıştırdığımda (tabloda 5 veri varsa) 5 satırda aynı geliyor.

    Kodları kısaltarak aşağıda veriyorum, yardımcı olabilirseniz çok sevinirim.

    PHP Kodu:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE 
    [dbo].[USER_LISTS
        @
    GET_ID bigint
    AS
    BEGIN
        
    DECLARE @SENT_TYPE bigint, @SENT_ID bigint, @SENT_CONTROL bigint, @SENT_NUMBER bigint, @SENT_FIRST nvarchar(150), @SENT_SECOND nvarchar(150), @SENT_THIRD nvarchar(150), @SENT_FOURTH nvarchar(150), @SENT_FIFTH bigint
        SET 
    @SENT_TYPE NULL
        SET 
    @SENT_ID NULL
        SET 
    @SENT_FIRST NULL
        SET 
    @SENT_SECOND NULL
        SET 
    @SENT_THIRD NULL
        SET 
    @SENT_FOURTH NULL
        SET 
    @SENT_FIFTH NULL
        SET 
    @SENT_CONTROL NULL
        SET 
    @SENT_NUMBER 1
        SET 
    @SENT_CONTROL = (SELECT COUNT(*) FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA 1)
                
    CREATE TABLE #TABLE_LISTS (
                    
    SENT_TYPE bigint,
                    
    SENT_ID bigintFIRST nvarchar(150), SECOND nvarchar(150), THIRD nvarchar(150), FOURTH nvarchar(150), FIFTH bigint
                    
    )
                    
    SELECT TOP 5 @SENT_TYPE LIST_TYPE, @SENT_ID LIST_ID FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA 1 ORDER BY LIST_ID ASC
                    
    WHILE @SENT_NUMBER <= @SENT_CONTROL
                    BEGIN
                    
    IF @SENT_TYPE 100
                        BEGIN
                            SELECT 
    @SENT_TYPE = @SENT_TYPE, @SENT_ID = @SENT_ID, @SENT_FIRST USER_REALNAME, @SENT_SECOND USER_NICK, @SENT_THIRD NULL, @SENT_FOURTH NULL, @SENT_FIFTH NULL FROM VW_LIST_FAVORITE_FRIENDS WHERE LIST_ID = @SENT_ID
                            INSERT INTO 
    #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) VALUES (@SENT_TYPE,@SENT_ID,@SENT_FIRST,@SENT_SECOND,@SENT_THIRD,@SENT_FOURTH,@SENT_FIFTH)
                            
    END
                    
    ELSE IF (@SENT_TYPE 101)
                        
    BEGIN
                            SELECT 
    @SENT_TYPE = @SENT_TYPE, @SENT_ID = @SENT_ID, @SENT_FIRST GROUP_NAME, @SENT_SECOND GROUP_URL, @SENT_THIRD NULL, @SENT_FOURTH NULL, @SENT_FIFTH NULL FROM VW_LIST_FAVORITE_GROUPS WHERE LIST_ID = @SENT_ID
                            INSERT INTO 
    #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) VALUES (@SENT_TYPE,@SENT_ID,@SENT_FIRST,@SENT_SECOND,@SENT_THIRD,@SENT_FOURTH,@SENT_FIFTH)
                        
    END
                    
    ELSE IF (@SENT_TYPE 102)
                        
    BEGIN
                            SELECT 
    @SENT_TYPE = @SENT_TYPE, @SENT_ID = @SENT_ID, @SENT_FIRST ARTIST_NAME, @SENT_SECOND ARTIST_URL, @SENT_THIRD ARTIST_TYPE, @SENT_FOURTH NULL, @SENT_FIFTH NULL FROM VW_LIST_FAVORITE_ARTISTS WHERE LIST_ID = @SENT_ID
                            INSERT INTO 
    #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) VALUES (@SENT_TYPE,@SENT_ID,@SENT_FIRST,@SENT_SECOND,@SENT_THIRD,@SENT_FOURTH,@SENT_FIFTH)
                        
    END
                        SET 
    @SENT_NUMBER = @SENT_NUMBER 1
                    END

                SELECT 
    FROM #TABLE_LISTS
    END 

  3. #13
    birinci yöntem;

    Kod:
    ALTER PROCEDURE [dbo].[USER_LISTS] 
        @GET_ID bigint
    AS
    BEGIN
                CREATE TABLE #TABLE_LISTS (
                    SENT_TYPE bigint,
                    SENT_ID bigint, 
                    FIRST nvarchar(150), 
                    SECOND nvarchar(150), 
                    THIRD nvarchar(150), 
                    FOURTH nvarchar(150), 
                    FIFTH bigint
                    )
    
    	  INSERT INTO #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) 
    	  SELECT R.LIST_TYPE, R.LIST_ID, F.USER_REALNAME, F.USER_NICK, NULL, NULL, NULL 
    		FROM VW_LIST_FAVORITE_FRIENDS F, R_USERS_LIST R
    		WHERE R.USER_ID = @GET_ID 
    			AND F.LIST_ID = R.LIST_ID 
    			AND R.LIST_TYPE = 100
    	UNION ALL
    	SELECT  R.LIST_TYPE, R.LIST_ID, G.GROUP_NAME, G.GROUP_URL, NULL, NULL, NULL 
    		FROM VW_LIST_FAVORITE_GROUPS G, R_USERS_LIST R
    		WHERE R.USER_ID = @GET_ID 
    			AND G.LIST_ID = R.LIST_ID 
    			AND R.LIST_TYPE = 101
    	UNION ALL
    	SELECT R.LIST_TYPE, R.LIST_ID, A.ARTIST_NAME, A.ARTIST_URL, A.ARTIST_TYPE, NULL, NULL 
    		FROM VW_LIST_FAVORITE_ARTISTS A, R_USERS_LIST R
    		WHERE R.USER_ID = @GET_ID 
    			AND A.LIST_ID = R.LIST_ID 
    			AND R.LIST_TYPE = 102
    
    	  SELECT * FROM #TABLE_LISTS
    	  DROP TABLE #TABLE_LISTS
    END
    her case için union kullanarak hiç döngüye sokmadan verileri alabilirsiniz. her ayrı select için top gerekiyorsa eklemeniz yeterli. union kullanmadan ayrı ayrı da yapabilirdik. union all yazan yere insert satırını koymak yeterli. ama bu şekilde daha bütünsel duruyor.

    Kod:
    SELECT R.LIST_TYPE, R.LIST_ID, F.USER_REALNAME, F.USER_NICK, NULL, NULL, NULL 
    		FROM VW_LIST_FAVORITE_FRIENDS F, R_USERS_LIST R
    		WHERE R.USER_ID = @GET_ID 
    			AND F.LIST_ID = R.LIST_ID 
    			AND R.LIST_TYPE = 100
    ele alırsak, gelen değerleri hiç bir şekilde değişkenlere atmadan, R_USERS_LIST tablosundaki R.LIST_TYPE'ı 100 olanları VW_LIST_FAVORITE_FRIENDS tablosu ile join ederek @GET_ID'ye göre filtreleyip geçici tablomuza aldık.

    aynı şekilde R_USERS_LIST tablosundaki R.LIST_TYPE'ı 101 olanları VW_LIST_FAVORITE_GROUPS tablosu ile join ederek @GET_ID'ye göre filtreleyip geçici tablomuza aldık.

    ve her R.LIST_TYPE için farklı tablolar ile join ederek istediğimiz kadar farklı tablo ile join ederek veri alabiliriz.

    bu şekilde hem while benzeri döngü ile yormamış, kod uzatmadan yapmış oluruz.

    ikinci yöntem;

    Kod:
    ALTER PROCEDURE [dbo].[USER_LISTS] 
    	@GET_ID bigint
    AS
    BEGIN
    	CREATE TABLE #TABLE_LISTS (
    		SENT_TYPE bigint,
    		SENT_ID bigint, 
    		FIRST nvarchar(150), 
    		SECOND nvarchar(150), 
    		THIRD nvarchar(150), 
    		FOURTH nvarchar(150), 
    		FIFTH bigint
    		)    
    
    	DECLARE @SENT_TYPE bigint, @SENT_ID bigint
    	SET @SENT_TYPE = NULL
    	SET @SENT_ID = NULL
     
    	DECLARE myCursor CURSOR FOR
     		SELECT TOP 5 LIST_TYPE, LIST_ID 
    			FROM R_USERS_LIST 
    			WHERE USER_ID = @GET_ID AND LIST_EXTRA = 1 ORDER BY LIST_ID ASC
    
    	OPEN myCursor
    
    	WHILE (0=0)
    	BEGIN
    		FETCH NEXT FROM myCursor
    			INTO @SENT_TYPE , @SENT_ID 
    		IF @@FETCH_STATUS<>0 BREAK
    
     		IF @SENT_TYPE = 100
    		BEGIN
    			INSERT INTO #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) 
    				SELECT  @SENT_TYPE, @SENT_ID, USER_REALNAME, USER_NICK, NULL, NULL, NULL 
    					FROM VW_LIST_FAVORITE_FRIENDS 
    					WHERE LIST_ID = @SENT_ID                        
    		END
    		ELSE IF (@SENT_TYPE = 101)
    		BEGIN
    			INSERT INTO #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH)
    				SELECT @SENT_TYPE, @SENT_ID, GROUP_NAME, GROUP_URL, NULL, NULL, NULL 
    					FROM VW_LIST_FAVORITE_GROUPS 
    					WHERE LIST_ID = @SENT_ID
    		END
    		ELSE IF (@SENT_TYPE = 102)
    		BEGIN
    			INSERT INTO #TABLE_LISTS (SENT_TYPE, SENT_ID, FIRST, SECOND, THIRD, FOURTH, FIFTH) 
    				SELECT @SENT_TYPE, @SENT_ID, ARTIST_NAME, ARTIST_URL, ARTIST_TYPE, NULL, NULL 
    					FROM VW_LIST_FAVORITE_ARTISTS 
    					WHERE LIST_ID = @SENT_ID
    		END
    	END
    
    	CLOSE myCursor
    	DEALLOCATE myCursor
    
    	SELECT * FROM #TABLE_LISTS
    	DROP TABLE #TABLE_LISTS
    END
    bu da döngü kullanmak. diğer kontrolleri neden yaptığınızı anlamadım, gerekiyorsa eklersiniz. bu yöntem, önceki yöntemde topluca yaptığımız işlemi her R_USERS_LIST satırı için satır satır işler. avantajı, kontrollü olması, dezavantajı ise yavaş olmasıdır.

    önerim 1. yöntemdir, ancak 2. yöntemde daha müdahale edilebilir haldedir.

    naçizane tavsiyelerim,
    - insert'ü değişkenlere almadan insert...select şeklinde kullanabilirsiniz (dikkatli kulalanmakta fayda var, zira select'e göre aynı anda birden fazla satır gelmiş ve insert edilmiş olabilir).
    - fetch kullanımının birkaç yöntemi vardır, farklı örneklerle karşılaşabilirsiniz.

    son olarak, her ne kadar geçici tablolar silinse de, işimizi kendimiz görmeye dikkat ediyoruz
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  4. #14
    Gece yarısı cursorlara dalmış kitaplarımı karıştırıyordum bu mesajınız ilaç gibi geldi Verdiğiniz kodlara baktım ve 1. yöntem de verdiğiniz kodlar daha basit geldi, hiç cursorlara girmeye gerek yokmuş yani, bu harika...

    Yalnız sizden bir ricam daha olucaktı, biliyorum fazla olmaya başladım ama ASP içerisinde çalışmamasının sebebi ne oalbilir bu kodun. Yine en başa döndüm sanırım çünkü nesne kapalı hatası vermeye başladı tekrar. Bu hatayı vermesinin nedeni ne olabilir ki? Query Analzer da çalıştırdığımda çok güzel bir şekilde sonuç döndürüyor ancak ASP sayfasına gelince "Nesne Kapalı" hatası veriyor?

    Saygılarımla....

  5. #15
    aslında 3. bir yöntem daha varmış

    Kod:
    SELECT R.USER_ID, R.LIST_TYPE, R.LIST_ID, F.USER_REALNAME, F.USER_NICK, NULL, NULL, NULL 
    	FROM VW_LIST_FAVORITE_FRIENDS F, R_USERS_LIST R
    	WHERE F.LIST_ID = R.LIST_ID 
    		AND R.LIST_TYPE = 100
    UNION ALL
    SELECT R.USER_ID, R.LIST_TYPE, R.LIST_ID, G.GROUP_NAME, G.GROUP_URL, NULL, NULL, NULL 
    	FROM VW_LIST_FAVORITE_GROUPS G, R_USERS_LIST R
    	WHERE G.LIST_ID = R.LIST_ID 
    		AND R.LIST_TYPE = 101
    UNION ALL
    SELECT R.USER_ID, R.LIST_TYPE, R.LIST_ID, A.ARTIST_NAME, A.ARTIST_URL, A.ARTIST_TYPE, NULL, NULL 
    	FROM VW_LIST_FAVORITE_ARTISTS A, R_USERS_LIST R
    	WHERE A.LIST_ID = R.LIST_ID 
    		AND R.LIST_TYPE = 102
    bunu bir view haline getirin (hem view'ın yeteneklerinden faydalanırsınız hem de geçici tablolar ile uğraşmazsınız) yada SP içerisinden geçici tabloyu ve insert...select'leri kaldırarak doğrudan select edin, ve view için

    Kod:
    set rs = server.createobject("adodb.recordset")
    rs.open "SELECT * FROM viewName WHERE USER_ID = "& GET_ID, connnection, 1
    şeklinde yada SP execute ederek açmaya çalışın bakalım nesne kapalı hatası verecek mi.

    her iki yöntemde de sorunsuz çalışması lazım, öteki türlü ASP kodlarınızı incelemekte fayda var.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  6. #16
    İşlem tamamdır, yardımlarınız için çok ama çok teşekkür ederim. 4 gündür çıldırmak üzereydim bu sorun yüzünden. Sizinde hayatınız boyunca tüm sorunlarınıza çözüm bulunması dileğiyle

  7. #17
    teşekkürler, çözüm olmasına sevindim
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

+ Yanıtla
Sayfa Düzeni: 2 / 2
İlkİlk 1 2

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz