Sybase’de Bir Virgülle Ayrılmış Listeyi Saklanan İşleme Nasıl Geçirirsiniz

Veritabanlarıyla çalışırken, bir saklanan işleme birden fazla parametre geçmeniz gereken durumlarla karşılaşabilirsiniz. Özellikle Sybase’de, bir virgülle ayrılmış liste dizelerini geçirmeye çalışırken zorluklarla karşılaşabilirsiniz. Bu blog yazısı, bu sorunu ele alacak ve size çözüm sürecinde adım adım rehberlik edecektir.

Sorun

Aşağıdaki saklanan işleminiz olduğunu hayal edin:

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)

Bu saklanan işleme 'John' ve 'Tom' gibi birden fazla isimle çağırmak istiyorsunuz. Ancak, bu listeyi geçmek için çeşitli yöntemler denediğinizde sorunlarla karşılaşıyorsunuz:

exec getSomething 'John'              -- Çalışıyor, ama sadece 1 değer
exec getSomething 'John','Tom'        -- Çalışmıyor; iki değişken bekliyor
exec getSomething "'John','Tom'"      -- Çalışmıyor; hiçbir şey bulamıyor
exec getSomething '"John","Tom"'      -- Çalışmıyor; hiçbir şey bulamıyor
exec getSomething '\'John\',\'Tom\''  -- Çalışmıyor; sözdizimi hatası

Görüldüğü gibi, doğrudan bir virgülle ayrılmış listeyi geçmek sorun haline geliyor. Peki, çözüm nedir?

Çözüm

Sybase 12.5 ve önceki sürümlerde, sıkıştırma işlevlerini doğrudan kullanamazsınız, bu nedenle seçenekleriniz sınırlıdır. Ancak, değerlerinizi tutmak için geçici bir tablo kullanmayı içeren pratik bir çözüm vardır.

Geçici Tablo Kullanma

  1. Virgülle ayrılmış listenizden değerleri tutmak için bir geçici tablo oluşturun. Örneğin:

    CREATE TABLE #TempNames (Name VARCHAR(100))
    
  2. Değerlerinizi geçici tabloya ekleyin ve listenizi bölecek bir yöntem kullanın. Sybase yerleşik dize bölme işlevleri sunmadığı için manuel olarak bunu şu şekilde yapabilirsiniz:

    • Değerlerinizi #TempNames tablosuna eklemek için dinamik SQL kullanmanız veya özel bir mantık yazmanız gerekebilir.
    • Uygulamanıza veya Sybase sürümünüze bağlı olarak, listeyi döngüye almak ve her bir öğeyi ayrı ayrı eklemek için bir komut dosyası yazmayı düşünebilirsiniz.
  3. Geçici tablodan verileri saklanan işlevinizde getirin. Saklanan işlevinizi şu şekilde değiştirebilirsiniz:

    CREATE PROCEDURE getSomething
    AS
    BEGIN
        DECLARE @sqlCommand VARCHAR(4096)
        SET @sqlCommand = 'SELECT * FROM mytbl WHERE name IN (SELECT Name FROM #TempNames)'
        EXEC(@sqlCommand)  -- Dinamik SQL'i çalıştırın
    END
    
  4. Geçici tabloya veri ekledikten sonra işleminizi çağırın:

    INSERT INTO #TempNames VALUES ('John'), ('Tom')
    EXEC getSomething
    

Ekstra Dikkat Edilmesi Gerekenler

  • Temizlik: Veritabanı ortamınızda karmaşayı önlemek için geçici tabloyu düşürmeyi unutmayın.
DROP TABLE #TempNames
  • Sybase Sürümleri: Daha yeni Sybase sürümleri kullanıyorsanız, dize manipülasyonu ve parametre yönetimini sağlayan yeni yöntemler veya özellikleri keşfedin.

Sonuç

Sybase’de bir virgülle ayrılmış listeyi saklanan bir işleme geçirmek başlangıçta zorlayıcı görünüyor olabilir, ancak geçici bir tablo kullanmak basit bir çözüm sunar. Bu yöntem, sözdizimi hataları yaşamadan birden fazla parametreyi yönetmenizi etkili bir şekilde sağlar. Benzer zorluklarla karşılaştığınızda, bu kılavuzu hatırlayın ve belirli ihtiyaçlarınıza uyacak şekilde özelleştirmekten çekinmeyin.

Bu adımlara odaklanarak, saklanan işlemlerinizin işlevselliğini artırabilir ve Sybase içindeki iş akışlarınızı geliştirebilirsiniz. Mutlu kodlamalar!