MSSQL Stored Prosedur Yardım
-
Merhaba arkadaşlar
Aşağıdaki stored prosedur de dinamik olarak sorgu cümlesi oluşturarak farklı veritabanlarından sorgu yapıyorum.
stored prosedür de dışarıdan aldığım değişkenle CariAd tablosundan sorgu yapıyorum
Dinamik olarak oluşturduğum kolonlarda sorgu yapamıyorum. Örneğin SubeNo colonunda sorgu yapmka istiyorum
hata alıyorum. Bu konuda yardımcı olabilecek biri var mı?Chat GPT de işe yaramadı saçmalıyor.
ALTER PROCEDURE [dbo].[Api_CariQuery] @CariAd nvarchar(100) AS BEGIN DECLARE @dynamicSQL NVARCHAR(MAX) = ''; SELECT @dynamicSQL = @dynamicSQL + 'SELECT CAST( CONCAT(''' + SubeAdi + ''',CAST(CariID as nvarchar(MAX))) As nvarchar(MAX)) as SubeNo, CariID, CariAd, UrunBilgisi, Ili, Ilcesi, Mahallle, CariAdres, CariTelefon, CariTelefon2, CariAciklama, KayitTarihi, SonIslemTarihi FROM ' + QUOTENAME(dbName) + '.dbo.Cari WHERE CariAd LIKE @CariAd UNION ' FROM OnayServis_1612.dbo.Veritabanlari; SET @dynamicSQL = LEFT(@dynamicSQL, LEN(@dynamicSQL) - 5); -- 'UNION ' ifadesini kaldırır DECLARE @CariAdPattern NVARCHAR(100); SET @CariAdPattern = '%' + @CariAd + '%'; EXEC sp_executesql @dynamicSQL, N'@CariAd nvarchar(100)', @CariAd = @CariAdPattern; END;
-
Dinamik kolonlarda en iyi sonucu view ile alırsın hocam, dinamik kolon oluşturduğun query'i view haline getir ve tablo gibi sorgula, en kötü ikinci bir select kullanırsan, örneğin select * from (select generated from products) where generated .... istediğini elde edebilirsin, ama uzun vadede view daha sağlam olacaktır, bu yöntem de sub-query olarak geçer. Ama view'ın performans konusunda +'ları olabiliyor ve genelleştirilmiş olduğu için daha mantıklı duruyor. Tahmin ediyorumki o ekstra veri tabanlarına bu viewı koymaktan üşeneceksen, sub query işini çözecektir.
-
mugen bunu yazdı
Dinamik kolonlarda en iyi sonucu view ile alırsın hocam, dinamik kolon oluşturduğun query'i view haline getir ve tablo gibi sorgula, en kötü ikinci bir select kullanırsan, örneğin select * from (select generated from products) where generated .... istediğini elde edebilirsin, ama uzun vadede view daha sağlam olacaktır, bu yöntem de sub-query olarak geçer. Ama view'ın performans konusunda +'ları olabiliyor ve genelleştirilmiş olduğu için daha mantıklı duruyor. Tahmin ediyorumki o ekstra veri tabanlarına bu viewı koymaktan üşeneceksen, sub query işini çözecektir.
The CREATE VIEW SQL construct or statement is not supported.
yani ben bu sorguyu muhakkak surette stored prosedürle yapmam gerekiyor.
farklı veritabanlarında aynı isimli tablolardan sorgulama yapıyorum.
bunu da dinamik olarak yapıyorum. databaselerden birinde Veritabanları adında bir tablo var
database adlarını orada tutup dinamik olarak sql sorgu cümlesi oluşturuyorum
yarın birgün farklı bir database'i de dahil etmek istediğimde kodu veya stored prosedürü güncellememe gerek kalmayacak.
Tek yapmam gereken veritabanları isimli tabloya database adını eklemek olacak.yapı böyle olduğu için view işimi görmüyor. stored prosedür ile sql query string oluşturup
execute ediyorum.
-
Asayisci bunu yazdımugen bunu yazdı
Dinamik kolonlarda en iyi sonucu view ile alırsın hocam, dinamik kolon oluşturduğun query'i view haline getir ve tablo gibi sorgula, en kötü ikinci bir select kullanırsan, örneğin select * from (select generated from products) where generated .... istediğini elde edebilirsin, ama uzun vadede view daha sağlam olacaktır, bu yöntem de sub-query olarak geçer. Ama view'ın performans konusunda +'ları olabiliyor ve genelleştirilmiş olduğu için daha mantıklı duruyor. Tahmin ediyorumki o ekstra veri tabanlarına bu viewı koymaktan üşeneceksen, sub query işini çözecektir.
The CREATE VIEW SQL construct or statement is not supported.
yani ben bu sorguyu muhakkak surette stored prosedürle yapmam gerekiyor.
farklı veritabanlarında aynı isimli tablolardan sorgulama yapıyorum.
bunu da dinamik olarak yapıyorum. databaselerden birinde Veritabanları adında bir tablo var
database adlarını orada tutup dinamik olarak sql sorgu cümlesi oluşturuyorum
yarın birgün farklı bir database'i de dahil etmek istediğimde kodu veya stored prosedürü güncellememe gerek kalmayacak.
Tek yapmam gereken veritabanları isimli tabloya database adını eklemek olacak.yapı böyle olduğu için view işimi görmüyor. stored prosedür ile sql query string oluşturup
execute ediyorum.
sub query önerisini denedin mi hocam, en çaresiz kaldığında o çalışır, veri tabanları yapını bilmiyorum, bir migration scripti falan kullanıyorsan aslında view sıkıntı olmazdı kurguda ama, subquery işini çözmeli
-
mugen bunu yazdıAsayisci bunu yazdımugen bunu yazdı
Dinamik kolonlarda en iyi sonucu view ile alırsın hocam, dinamik kolon oluşturduğun query'i view haline getir ve tablo gibi sorgula, en kötü ikinci bir select kullanırsan, örneğin select * from (select generated from products) where generated .... istediğini elde edebilirsin, ama uzun vadede view daha sağlam olacaktır, bu yöntem de sub-query olarak geçer. Ama view'ın performans konusunda +'ları olabiliyor ve genelleştirilmiş olduğu için daha mantıklı duruyor. Tahmin ediyorumki o ekstra veri tabanlarına bu viewı koymaktan üşeneceksen, sub query işini çözecektir.
The CREATE VIEW SQL construct or statement is not supported.
yani ben bu sorguyu muhakkak surette stored prosedürle yapmam gerekiyor.
farklı veritabanlarında aynı isimli tablolardan sorgulama yapıyorum.
bunu da dinamik olarak yapıyorum. databaselerden birinde Veritabanları adında bir tablo var
database adlarını orada tutup dinamik olarak sql sorgu cümlesi oluşturuyorum
yarın birgün farklı bir database'i de dahil etmek istediğimde kodu veya stored prosedürü güncellememe gerek kalmayacak.
Tek yapmam gereken veritabanları isimli tabloya database adını eklemek olacak.yapı böyle olduğu için view işimi görmüyor. stored prosedür ile sql query string oluşturup
execute ediyorum.
sub query önerisini denedin mi hocam, en çaresiz kaldığında o çalışır, veri tabanları yapını bilmiyorum, bir migration scripti falan kullanıyorsan aslında view sıkıntı olmazdı kurguda ama, subquery işini çözmeli
buna bi bakacağım.
-
:)
-
Hocam aşağıdaki kodu dener misin? Gerekli durumları yorum satırına yazdım
ALTER PROCEDURE [dbo].[Api_CariQuery] @CariAd nvarchar(100) AS BEGIN DECLARE @dynamicSQL NVARCHAR(MAX) = ''; SELECT @dynamicSQL = @dynamicSQL + 'SELECT CAST( CONCAT(''' + SubeAdi + ''',CAST(CariID as nvarchar(MAX))) As nvarchar(MAX)) as SubeNo, CariID, CariAd, UrunBilgisi, Ili, Ilcesi, Mahallle, CariAdres, CariTelefon, CariTelefon2, CariAciklama, KayitTarihi, SonIslemTarihi FROM ' + QUOTENAME(dbName) + '.dbo.Cari WHERE CariAd LIKE @CariAd UNION ' FROM OnayServis_1612.dbo.Veritabanlari; SET @dynamicSQL = LEFT(@dynamicSQL, LEN(@dynamicSQL) - 5); -- 'UNION ' ifadesini kaldırır DECLARE @CariAdPattern NVARCHAR(100); SET @CariAdPattern = '%' + @CariAd + '%'; --EXEC sp_executesql @dynamicSQL, N'@CariAd nvarchar(100)', @CariAd = @CariAdPattern; CREATE TABLE #tempTable(SubeNo nvarchar(100), CariID int, CariAd nvarchar(100)); -- burada sütunları tablo ile aynı olacak şekilde düzenle DECLARE @dynamicSQL1 NVARCHAR(MAX); SET @dynamicSQL1 = 'INSERT INTO #tempTable ' + @dynamicSQL; -- Buradaki insert into yu yukarıda oluşturduğun sorguyada ekleyebilirsin. Ekstra bir değişken tanımlamana gerek kalmaz hocam EXEC sp_executesql @dynamicSQL1, N'@CariAd nvarchar(100)', @CariAd = @CariAdPattern; SELECT * FROM #tempTable WHERE SubeNo=1; -- Where koşullarını kendine göre ayarlarsın END;
-
Yazilimci bunu yazdı
Hocam aşağıdaki kodu dener misin? Gerekli durumları yorum satırına yazdım
ALTER PROCEDURE [dbo].[Api_CariQuery] @CariAd nvarchar(100) AS BEGIN DECLARE @dynamicSQL NVARCHAR(MAX) = ''; SELECT @dynamicSQL = @dynamicSQL + 'SELECT CAST( CONCAT(''' + SubeAdi + ''',CAST(CariID as nvarchar(MAX))) As nvarchar(MAX)) as SubeNo, CariID, CariAd, UrunBilgisi, Ili, Ilcesi, Mahallle, CariAdres, CariTelefon, CariTelefon2, CariAciklama, KayitTarihi, SonIslemTarihi FROM ' + QUOTENAME(dbName) + '.dbo.Cari WHERE CariAd LIKE @CariAd UNION ' FROM OnayServis_1612.dbo.Veritabanlari; SET @dynamicSQL = LEFT(@dynamicSQL, LEN(@dynamicSQL) - 5); -- 'UNION ' ifadesini kaldırır DECLARE @CariAdPattern NVARCHAR(100); SET @CariAdPattern = '%' + @CariAd + '%'; --EXEC sp_executesql @dynamicSQL, N'@CariAd nvarchar(100)', @CariAd = @CariAdPattern; CREATE TABLE #tempTable(SubeNo nvarchar(100), CariID int, CariAd nvarchar(100)); -- burada sütunları tablo ile aynı olacak şekilde düzenle DECLARE @dynamicSQL1 NVARCHAR(MAX); SET @dynamicSQL1 = 'INSERT INTO #tempTable ' + @dynamicSQL; -- Buradaki insert into yu yukarıda oluşturduğun sorguyada ekleyebilirsin. Ekstra bir değişken tanımlamana gerek kalmaz hocam EXEC sp_executesql @dynamicSQL1, N'@CariAd nvarchar(100)', @CariAd = @CariAdPattern; SELECT * FROM #tempTable WHERE SubeNo=1; -- Where koşullarını kendine göre ayarlarsın END;
Bu işimi çözdü.
teşekkür ederim.