Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Database ve tablo isimlerini parametre olarak kullanma
#1
Merhaba,

Database ve tablo isimlerini parametre olarak atama imkanı var mıdır ?
Yardımınız ve desteğiniz için şimdiden teşekkürler.

iyi çalışmalar,

DECLARE @Firma int=1
DECLARE @Hesapp int=1


declare @Yevmiye1 VARCHAR(250)='[DENEME_FİRMASI_2_2016].[dbo].[yevmiye] Y'
declare @Yevmiye2 VARCHAR(250)='[DENEME_FİRMASI_2_2017].[dbo].[yevmiye] Y'
declare @Yevmiye3 VARCHAR(250)='[DENEME_FİRMASI_2_2018].[dbo].[yevmiye] Y'
declare @Yevmiye4 VARCHAR(250)='[DENEME_FİRMASI_2_2019].[dbo].[yevmiye] Y'


declare @Hesapplani1 VARCHAR(250)='[DENEME_FİRMASI_2016].[dbo].[hesplan] h'
declare @Hesapplani2 VARCHAR(250)='[DENEME_FİRMASI_2017].[dbo].[hesplan] h'
declare @Hesapplani3 VARCHAR(250)='[DENEME_FİRMASI_2018].[dbo].[hesplan] h'
declare @Hesapplani4 VARCHAR(250)='[DENEME_FİRMASI_2019].[dbo].[hesplan] h'


declare @Yevmiye VARCHAR(250) = 
CASE WHEN @Firma = 1 THEN  @Yevmiye1 
WHEN @Firma = 2 THEN @Yevmiye2 
WHEN @Firma = 3 THEN @Yevmiye3
WHEN @Firma = 4 THEN @Yevmiye4 
ELSE @Yevmiye1
END;    


declare @Hesapplani VARCHAR(250) = 
CASE WHEN @Hesapp = 1 THEN @Hesapplani1 
WHEN @Hesapp = 2 THEN @Hesapplani2 
WHEN @Hesapp = 3 THEN @Hesapplani3
WHEN @Hesapp = 4 THEN @Hesapplani4 
ELSE @Hesapplani1
END; 



SELECT @Firma AS Firma, y.Refno,y.Refno2,y.Gmkod,h.Aciklama,h.Vergidairesi as VERGI_DAIRESI,
h.Vergikimlikno as VERGI_NO,
y.Fistar,y.Evraktarihi,y.Evrakno,
MONTH(y.Fistar) as Ay,year(y.Fistar) as Yil,
y.Fistur,y.Fisno,y.Aciklama,
(COALESCE(y.Doviz, 0)) as Doviz,
(COALESCE(y.Dovizadi,0)) AS Dovizadi,

CASE WHEN (COALESCE(y.Borclu,0)) > 0.00 then 
(COALESCE(y.Doviz, 0)) ELSE
0.00 END AS Doviz_Borc,

CASE WHEN (COALESCE(y.Alacakli,0)) > 0.00 then 
(COALESCE(y.Doviz, 0)) ELSE
0.00 END AS Doviz_Alacak,
CASE 
WHEN y.Dovizadi = NULL THEN 'TRY'
WHEN y.Dovizadi = 1 THEN 'TRY'
WHEN y.Dovizadi = 2 THEN 'USD'
WHEN y.Dovizadi = 3 THEN 'EURO'
ELSE 'TRY' END AS Doviz_Adi,
(COALESCE(y.Borclu,0)) as Borclu,
(COALESCE(y.Alacakli,0)) as Alacakli
,y.Islemtipi,y.Belge_Turu,
--y.Belge_Turu_Aciklamasi,
CASE 
WHEN y.Belge_Turu = 1 THEN 'Fatura'
WHEN y.Belge_Turu = 2 THEN 'Çek'
WHEN y.Belge_Turu = 3 THEN 'Makbuz'
WHEN y.Belge_Turu = 4 THEN 'Müşteri Sipariş Belgesi'
WHEN y.Belge_Turu = 5 THEN 'Satıcı Sipariş Belgesi'
WHEN y.Belge_Turu = 6 THEN 'Senet'
WHEN y.Belge_Turu = 7 THEN 'Navlun'
WHEN y.Belge_Turu = 8 THEN y.Belge_Turu_Aciklamasi
WHEN y.Belge_Turu = 9 THEN 'Belge Yok'
ELSE '' END AS Belge_Turu_Aciklamasi,

CASE WHEN y.Vade_Tarihi is null then y.Evraktarihi
else y.Vade_Tarihi end as Vade_Tarihi


,(convert(varchar,@Firma)) +'-'+(convert(varchar,y.Fisno) +'-'+convert(varchar,MONTH(y.Fistar)) +'-'+ convert(varchar,(DATEPART(yy,(DATEADD(YEAR,0,y.Fistar)))))
+'-'+convert(varchar,y.Fistur) +'-'+ convert(varchar,y.Refno)+'-'+ convert(varchar,y.Refno2)) AS REF
, GETDATE() as Mtarih, '' AS Kod, '' AS Kod2,'' AS Kod3, '' AS Kod4,'' AS Kod5  

FROM @Yevmiye 
LEFT JOIN @Hesapplani h on h.Kod=y.Gmkod  COLLATE Turkish_CS_AS


order by y.Fistar, y.Fistur, y.Fisno, y.Refno
Cevapla
#2
CREATE PROCEDURE [GetYevmiye] (@Firma int,@Hesapp int)
AS
BEGIN

declare @Yevmiye1 VARCHAR(250)='[DENEME_FİRMASI_2_2016].[dbo].[yevmiye] Y'
declare @Yevmiye2 VARCHAR(250)='[DENEME_FİRMASI_2_2017].[dbo].[yevmiye] Y'
declare @Yevmiye3 VARCHAR(250)='[DENEME_FİRMASI_2_2018].[dbo].[yevmiye] Y'
declare @Yevmiye4 VARCHAR(250)='[DENEME_FİRMASI_2_2019].[dbo].[yevmiye] Y'


declare @Hesapplani1 VARCHAR(250)='[DENEME_FİRMASI_2016].[dbo].[hesplan] h'
declare @Hesapplani2 VARCHAR(250)='[DENEME_FİRMASI_2017].[dbo].[hesplan] h'
declare @Hesapplani3 VARCHAR(250)='[DENEME_FİRMASI_2018].[dbo].[hesplan] h'
declare @Hesapplani4 VARCHAR(250)='[DENEME_FİRMASI_2019].[dbo].[hesplan] h'


declare @Yevmiye VARCHAR(250) = 
CASE WHEN @Firma = 1 THEN  @Yevmiye1 
WHEN @Firma = 2 THEN @Yevmiye2 
WHEN @Firma = 3 THEN @Yevmiye3
WHEN @Firma = 4 THEN @Yevmiye4 
ELSE @Yevmiye1
END;    


declare @Hesapplani VARCHAR(250) = 
CASE WHEN @Hesapp = 1 THEN @Hesapplani1 
WHEN @Hesapp = 2 THEN @Hesapplani2 
WHEN @Hesapp = 3 THEN @Hesapplani3
WHEN @Hesapp = 4 THEN @Hesapplani4 
ELSE @Hesapplani1
END; 


EXEC ('
SELECT @Firma AS Firma, y.Refno,y.Refno2,y.Gmkod,h.Aciklama,h.Vergidairesi as VERGI_DAIRESI,
h.Vergikimlikno as VERGI_NO,
y.Fistar,y.Evraktarihi,y.Evrakno,
MONTH(y.Fistar) as Ay,year(y.Fistar) as Yil,
y.Fistur,y.Fisno,y.Aciklama,
(COALESCE(y.Doviz, 0)) as Doviz,
(COALESCE(y.Dovizadi,0)) AS Dovizadi,

CASE WHEN (COALESCE(y.Borclu,0)) > 0.00 then
(COALESCE(y.Doviz, 0)) ELSE
0.00 END AS Doviz_Borc,

CASE WHEN (COALESCE(y.Alacakli,0)) > 0.00 then
(COALESCE(y.Doviz, 0)) ELSE
0.00 END AS Doviz_Alacak,
CASE
WHEN y.Dovizadi = NULL THEN ''TRY''
WHEN y.Dovizadi = 1 THEN ''TRY''
WHEN y.Dovizadi = 2 THEN ''USD''
WHEN y.Dovizadi = 3 THEN ''EURO''
ELSE ''TRY'' END AS Doviz_Adi,
(COALESCE(y.Borclu,0)) as Borclu,
(COALESCE(y.Alacakli,0)) as Alacakli
,y.Islemtipi,y.Belge_Turu,
--y.Belge_Turu_Aciklamasi,
CASE
WHEN y.Belge_Turu = 1 THEN ''Fatura''
WHEN y.Belge_Turu = 2 THEN ''Çek''
WHEN y.Belge_Turu = 3 THEN ''Makbuz''
WHEN y.Belge_Turu = 4 THEN ''Müşteri Sipariş Belgesi''
WHEN y.Belge_Turu = 5 THEN ''Satıcı Sipariş Belgesi''
WHEN y.Belge_Turu = 6 THEN ''Senet''
WHEN y.Belge_Turu = 7 THEN ''Navlun''
WHEN y.Belge_Turu = 8 THEN y.Belge_Turu_Aciklamasi
WHEN y.Belge_Turu = 9 THEN ''Belge Yok''
ELSE '' END AS Belge_Turu_Aciklamasi,

CASE WHEN y.Vade_Tarihi is null then y.Evraktarihi
else y.Vade_Tarihi end as Vade_Tarihi


,(convert(varchar,@Firma)) +'-'+(convert(varchar,y.Fisno) +'-'+convert(varchar,MONTH(y.Fistar)) +'-'+ convert(varchar,(DATEPART(yy,(DATEADD(YEAR,0,y.Fistar)))))
+'-'+convert(varchar,y.Fistur) +'-'+ convert(varchar,y.Refno)+'-'+ convert(varchar,y.Refno2)) AS REF
, GETDATE() as Mtarih, '' AS Kod, '' AS Kod2,'' AS Kod3, '' AS Kod4,'' AS Kod5  

FROM '+@Yevmiye+' 
LEFT JOIN '+@Hesapplani+' h on h.Kod=y.Gmkod  COLLATE Turkish_CS_AS


order by y.Fistar, y.Fistur, y.Fisno, y.Refno'

END


--KULLANIM
--EXEC GetYevmiye @Firma = 1,@Hesapp =1

Database olmadığı için deneme şansım yoktu.
Cevapla
#3
Merhaba,

Sayın elixir84 ilginize öncelikle teşekkür ederim, yalnız benden de kaynaklanan bir hatadan dolayı olabilir database cinsini yazmamışım mssql olacak, bu yüzden tırnaklar ile ilgili ufak efekt düzeltmeler yapmak zorunda kaldım ama sonuç olarak yine hata veremeye devam ediyor.

   
Msg 1087, Level 16, State 1, Procedure GetYevmiye, Line 81
Must declare the table variable "@Yevmiye".
Msg 1087, Level 16, State 1, Procedure GetYevmiye, Line 82
Must declare the table variable "@Hesapplani".
Cevapla
#4
(26-12-2019, Saat: 16:49)denizfatihi Adlı Kullanıcıdan Alıntı: Merhaba,

Sayın elixir84 ilginize öncelikle teşekkür ederim, yalnız benden de kaynaklanan bir hatadan dolayı olabilir database cinsini yazmamışım mssql olacak, bu yüzden tırnaklar ile ilgili ufak efekt düzeltmeler yapmak zorunda kaldım ama sonuç olarak yine hata veremeye devam ediyor.

   
Msg 1087, Level 16, State 1, Procedure GetYevmiye, Line 81
Must declare the table variable "@Yevmiye".
Msg 1087, Level 16, State 1, Procedure GetYevmiye, Line 82
Must declare the table variable "@Hesapplani".

Gönderdiğim gibi deneyip 

order by y.Fistar, y.Fistur, y.Fisno, y.Refno'
sonuna parantez koymamışım sanırım. Parantez koyup denermisiniz 

order by y.Fistar, y.Fistur, y.Fisno, y.Refno')
Cevapla
#5
Aslında hedeflediğiniz işlem için farklı bir yapı tavsiye edeceğim. Örnek basit bir select-from üzerinden tarif edildi ama sadece select üzerinden ayar çekerek istediğiniz işlemi yapabilirsiniz. Ana mantık bir tablo üreten sorguyu (burada sp_executesql Stored Procedure üzerinden kullandık) alan isimleri uyuşacak şekilde insert sorgusunda kullanabilmemizdir.
declare @TabloAdi nvarchar(50), @RaporSQL nvarchar(max) = N'select alan1, alan2, alan3 from ', @SQL nvarchar(max)
declare @Rapor table (id int identity, alanA nvarchar(50), alanB nvarchar(50), alanC nvarchar(50))

set @TabloAdi = N'dbX.dbo.Tablo'
set @SQL =  @RaporSQL + @TabloAdi
insert into @Rapor (alaA, alanB, alanC)
execute sp_executesql @SQL


set @TabloAdi = N'dbY.dbo.Tablo'
set @SQL =  @RaporSQL + @TabloAdi
insert into @Rapor (alaA, alanB, alanC)
execute sp_executesql @SQL

set @TabloAdi = N'dbZ.dbo.Tablo'
set @SQL =  @RaporSQL + @TabloAdi
insert into @Rapor (alaA, alanB, alanC)
execute sp_executesql @SQL

select * from @Rapor
Görüldüğü üzere @SQL değişkeninde (bir tablo içindeki) listelenecek sorguyu oluşturduktan sonra declare table ile tanımlı @Rapor tablo değişkenine direkt insert into ile ekledik. Aynı şekilde başka tabloları da art arda insert into ile eklememiz durumunda @Rapor tablosunda bütün eklenen kayıtlar birikecek ve istenilen kayıtların hepsi bir arada bu tabloda bulunacaktır.
Cevapla
#6
Dinamik sql kullanmam gerektiğinde aşağıdaki yapıdaki gibi kullanıyorum. 

declare @db1 nvarchar(15) = N'veritabaniA'
declare @db2 nvarchar(15) =  N'veritabaniB'
declare @sqltext nvarchar(max)

set @sqltext=N'select b.* from '+@db1+'.dbo.USER a
inner join '+@db2+'.dbo.SKART b on a.USERNAME=b.CREATEDUSER
where a.USERNAME=@param'

EXEC sp_executesql @sqltext,N'@param varchar(15)',@param=N'ADMIN'

örnekte veritabanı isimleri değişkende ayrıca kullanıcı adı parametre olarak yollanıyor.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  MSSQL TableType tipinde parametre nasıl geçilir? adelphiforumz 28 7.527 29-12-2021, Saat: 11:37
Son Yorum: mrmarman
  Sql server 2008 R2 veya Yukarısı için Database Kopyalaması Hk. cinarbil 6 3.440 15-09-2020, Saat: 09:14
Son Yorum: DelphiCan
  Çözüldü Ado sorguda time bilgisini tamsayı olarak kaydetme cinarbil 3 2.386 08-08-2020, Saat: 10:54
Son Yorum: Bay_Y
  Çoklu sql database yedekleme programı cinarbil 3 2.727 01-05-2020, Saat: 21:53
Son Yorum: hasangoktas
  String tarih ve saat alanını birleştirme kullanma cinarbil 9 10.246 22-08-2019, Saat: 00:25
Son Yorum: serdar



Konuyu Okuyanlar: 1 Ziyaretçi