﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Server&#8217;da İki Veritabanı Arasında Veri Aktarımı &#8211; SQL Server Eğitimleri</title>
	<atom:link href="https://sqlserveregitimleri.com/etiket/sql-serverda-iki-veritabani-arasinda-veri-aktarimi/feed" rel="self" type="application/rss+xml" />
	<link>https://sqlserveregitimleri.com</link>
	<description>SQL Server ile ilgili her şey</description>
	<lastBuildDate>Thu, 17 Feb 2022 17:29:26 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>SQL Server&#8217;da İki Veritabanı Arasında Veri Aktarımı</title>
		<link>https://sqlserveregitimleri.com/sql-serverda-iki-veritabani-arasinda-veri-aktarimi</link>
		
		<dc:creator><![CDATA[Yavuz Selim Kart]]></dc:creator>
		<pubDate>Fri, 20 Sep 2019 07:18:18 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server'da İki Veritabanı Arasında Veri Aktarımı]]></category>
		<category><![CDATA[SQL Veri Aktarımı]]></category>
		<category><![CDATA[Veritabanı Arasında Veri Aktarımı]]></category>
		<guid isPermaLink="false">http://sqlserveregitimleri.com/?p=7633</guid>

					<description><![CDATA[Herkese merhaba, Bu yazıda SQL Server&#8217;da iki veritabanı arasında, veri aktarım işleminin nasıl yapılacağından bahsedeceğim. Yazının çıkış noktası bir öğrenci. Bu soru kendisine sorulmuş. Nasıl...]]></description>
										<content:encoded><![CDATA[<p>Herkese merhaba,</p>
<p>Bu yazıda SQL Server&#8217;da iki veritabanı arasında, veri aktarım işleminin nasıl yapılacağından bahsedeceğim.</p>
<p>Yazının çıkış noktası bir öğrenci. Bu soru kendisine sorulmuş. Nasıl çözebileceği hakkında bana sordu. Sonrasında makaleye çevirmeye karar verdim.</p>
<p>Yapılmak istenen işlem ise şu.</p>
<pre class="line-numbers"><code class="language-sql">INSERT INTO table1
(
    column1
)
SELECT col1
FROM table2;</code></pre>
<p>Bu işlemi veritabanı seçerek (Parametrik) tüm tablolar için yapmak. (Prosedür kullanarak)</p>
<p>Kısaca iki veritabanının tablo ve şema isimleri aynı olacak ve birinci veritabanındaki dolu verilerin ikinci veritabanındaki boş tablolar içine aktarılması. (Tüm tablolar için yapılacak)</p>
<p>Bu işlem için örnek bir veritabanı oluşturup yapılacak işlemi anlatacağım.</p>
<p>Birinci veritabanımız ve tablolar içindeki veriler şöyle olsun.</p>
<pre class="line-numbers"><code class="language-sql">CREATE DATABASE DB1;
USE DB1;

CREATE TABLE [dbo].[Tablo1]
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [Ad] [VARCHAR](50) NULL,
    [Soyad] [VARCHAR](50) NULL,
    CONSTRAINT [PK_Tablo1]
        PRIMARY KEY CLUSTERED ([id] ASC)
);

CREATE TABLE [dbo].[Tablo2]
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [il] [VARCHAR](50) NULL,
    CONSTRAINT [PK_Tablo2]
        PRIMARY KEY CLUSTERED ([id] ASC)
);

INSERT INTO Tablo1
VALUES
('Yavuz', 'Selim'),
('Hasan', 'Ali');
INSERT INTO Tablo2
VALUES
('İstanbul'),
('Ankara'),
('İzmir');</code></pre>
<p>Veritabanı ve tabloları oluşturup sonrasında ilgili verileri içine ekleyelim.</p>
<p>Şimdi aynı işlemi ikinci veritabanı için yapalım. Fakat bu sefer tablo içine veri eklemiyoruz.</p>
<pre class="line-numbers"><code class="language-sql">CREATE DATABASE DB2;
USE DB2;

CREATE TABLE [dbo].[Tablo1]
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [Ad] [VARCHAR](50) NULL,
    [Soyad] [VARCHAR](50) NULL,
    CONSTRAINT [PK_Tablo1]
        PRIMARY KEY CLUSTERED ([id] ASC)
);


CREATE TABLE [dbo].[Tablo2]
(
    [id] [INT] IDENTITY(1, 1) NOT NULL,
    [il] [VARCHAR](50) NULL,
    CONSTRAINT [PK_Tablo2]
        PRIMARY KEY CLUSTERED ([id] ASC)
);</code></pre>
<p>Görüldüğü üzere ikinci veritabanı içine herhangi bir veri eklemedik.</p>
<p>Tablolara dikkat ederseniz iki tabloda da otomatik artan id değerleri var. Bu değerlerin insert into ile diğer tabloya aktarılması durumunda aşağıdaki gibi bir hata alacaksınız.</p>
<p><strong>Cannot <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">insert</span></span></span><span class="hljs-operator"> explicit </span><span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">value</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">for</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">identity</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">column</span></span></span> <span class="token operator"><span class="hljs-operator"><span class="hljs-keyword">in</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">table</span></span></span> <span class="token string"><span class="hljs-operator"><span class="hljs-string">&#8216;Tablonuz&#8217;</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">when</span></span></span> <span class="token keyword"><span class="hljs-operator">identity_insert</span></span> <span class="token operator"><span class="hljs-operator"><span class="hljs-keyword">is</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">set</span></span></span> <span class="token keyword"><span class="hljs-operator"><span class="hljs-keyword">to</span></span></span> <span class="token keyword"><span class="hljs-operator">off</span></span><span class="token punctuation"><span class="hljs-operator">.</span></span></strong></p>
<p>Bunu kapatmanın yolunu öğrenmek için aşağıdaki makaleyi okuyabilirsiniz.</p>
[related-post id=&#8221;2796&#8243;]
<p>Makaleyi okuduysanız çözümü artık biliyorsunuz.</p>
<p>Şimdi gelelim esas konumuza.</p>
<p>Benim yapmak istediğim işlem kısaca dinamik olarak her tablo için <strong>INSERT INTO</strong> işleminin yapılması.</p>
<p>Aşağıdaki gibi neden yapmıyorsunuz diyenler olacak.</p>
<pre class="line-numbers"><code class="language-sql">INSERT INTO tablo2
SELECT *
FROM tablo1;</code></pre>
<p>SQL Server&#8217;da sorguları <strong>*</strong> kullanarak kolonları alıp diğer tablonun içine ekleyemiyorsunuz.</p>
<p>İsterseniz deneyebilirsiniz. Sadece tek tek kolon adlarını yazarak böyle bir işlemi yapabilirsiniz.</p>
<pre class="line-numbers"><code class="language-sql">INSERT INTO tablo2
(
    kolon1,
    kolon2
)
SELECT digerkolon1,
       digerkolon2
FROM tablo1;</code></pre>
<p>Ayrıca burada her tablo için aşağıdaki sıkıntı da mevcut.</p>
<p><strong>IDENTITY_INSERT is Set to Off Hatası.</strong></p>
<p>İşte bu işlemlerin de dinamik olarak yapılması ve tablodaki verilerin diğer tabloya otomatik olarak eklenmesi için aşağıdaki gibi bir prosedür yazdım. Belki başka şekilde çözümler olacaktır. Bu konuda tarafıma her zaman yazabilirsiniz.</p>
<pre class="line-numbers"><code class="language-sql">CREATE PROC DBTabloVeriAktar
(
    @AktarilacakDB VARCHAR(100),
    @AktarilanDB VARCHAR(100)
)
AS
BEGIN
    DECLARE @TabloAdi VARCHAR(100);
    DECLARE @VeritabaniAdi2 VARCHAR(100) = @AktarilanDB;
    DECLARE @KolonAdi VARCHAR(100);
    DECLARE @KolonAdiListesiSon NVARCHAR(4000);
    DECLARE @SQLSorgu NVARCHAR(4000);
    DECLARE CursorYapisi CURSOR FOR
    SELECT DISTINCT
           c.TABLE_NAME
    FROM INFORMATION_SCHEMA.COLUMNS c
        LEFT OUTER JOIN INFORMATION_SCHEMA.TABLES t
            ON c.TABLE_CATALOG = t.TABLE_CATALOG
               AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
               AND c.TABLE_NAME = t.TABLE_NAME
    WHERE t.TABLE_TYPE = 'BASE TABLE'
          AND c.TABLE_CATALOG = @AktarilacakDB
          AND c.TABLE_NAME NOT IN ( 'sysdiagrams' );
    OPEN CursorYapisi;
    FETCH NEXT FROM CursorYapisi
    INTO @TabloAdi;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        CREATE TABLE #tabloadlari
        (
            tabload VARCHAR(25)
        );

        DECLARE CursorYapisi2 CURSOR FOR

        SELECT DISTINCT
               c.COLUMN_NAME
        FROM INFORMATION_SCHEMA.COLUMNS c
            LEFT OUTER JOIN INFORMATION_SCHEMA.TABLES t
                ON c.TABLE_CATALOG = t.TABLE_CATALOG
                   AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
                   AND c.TABLE_NAME = t.TABLE_NAME
        WHERE t.TABLE_TYPE = 'BASE TABLE'
              AND c.TABLE_CATALOG = @AktarilacakDB
              AND c.TABLE_NAME NOT IN ( 'sysdiagrams' )
              AND c.TABLE_NAME = @TabloAdi;
        OPEN CursorYapisi2;
        FETCH NEXT FROM CursorYapisi2
        INTO @KolonAdi;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            -- 

            PRINT @KolonAdi;
            INSERT INTO #tabloadlari
            (
                tabload
            )
            VALUES
            (@KolonAdi -- tabload - varchar(25) 
                );
            FETCH NEXT FROM CursorYapisi2
            INTO @KolonAdi;
        END;
        CLOSE CursorYapisi2;
        DEALLOCATE CursorYapisi2;
        DECLARE @KolonAdiListesi VARCHAR(4000);
        SET @KolonAdiListesi = '';
        SELECT @KolonAdiListesi = @KolonAdiListesi + tabload + ', '
        FROM #tabloadlari;
        SELECT @KolonAdiListesiSon = SUBSTRING(@KolonAdiListesi, 0, LEN(@KolonAdiListesi));
        --PRINT @KolonAdiListesi 
        DROP TABLE #tabloadlari;
        SET @SQLSorgu
            = N'SET IDENTITY_INSERT [' + @VeritabaniAdi2 + N'].[dbo].[' + @TabloAdi + N'] ON INSERT INTO ['
              + @AktarilanDB + N'].[dbo].[' + @TabloAdi + N'] ( ' + @KolonAdiListesiSon + N' ) SELECT '
              + @KolonAdiListesiSon + N' FROM [' + @AktarilacakDB + N'].[dbo].[' + @TabloAdi
              + N'] SET IDENTITY_INSERT [' + @VeritabaniAdi2 + N'].[dbo].[' + @TabloAdi + N'] OFF;';
        EXEC (@SQLSorgu);
        --PRINT @SQLSorgu; 
        FETCH NEXT FROM CursorYapisi
        INTO @TabloAdi;
    END;
    CLOSE CursorYapisi;
    DEALLOCATE CursorYapisi;
END;</code></pre>
<p>Prosedürü oluşturalım.</p>
<p>Şimdi test edelim.</p>
<pre class="line-numbers"><code class="language-sql">EXEC dbo.DBTabloVeriAktar @AktarilacakDB = 'DB1', -- varchar(100) 
                          @AktarilanDB = 'DB2';   -- varchar(100)</code></pre>
<p>Sorguyu çalıştırdığınızda ikinci veritabanı içine verilerin başarıyla eklendiğini göreceksiniz.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-7635 size-full" src="https://sqlserveregitimleri.com/wp-content/uploads/2019/09/sql-serverda-iki-veritabani-arasinda-veri-aktarimi-1.jpg" alt="SQL Server'da İki Veritabanı Arasında Veri Aktarımı" width="700" height="568" srcset="https://sqlserveregitimleri.com/wp-content/uploads/2019/09/sql-serverda-iki-veritabani-arasinda-veri-aktarimi-1.jpg 700w, https://sqlserveregitimleri.com/wp-content/uploads/2019/09/sql-serverda-iki-veritabani-arasinda-veri-aktarimi-1-315x256.jpg 315w, https://sqlserveregitimleri.com/wp-content/uploads/2019/09/sql-serverda-iki-veritabani-arasinda-veri-aktarimi-1-370x300.jpg 370w, https://sqlserveregitimleri.com/wp-content/uploads/2019/09/sql-serverda-iki-veritabani-arasinda-veri-aktarimi-1-166x135.jpg 166w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>Görüldüğü üzere veriler başarıyla ikinci veritabanında ki iki tabloya da kopyalandı.</p>
<p>Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.</p>
<div class='epvc-post-count'><span class='epvc-eye'></span>  <span class="epvc-count"> 1.783</span><span class='epvc-label'> Kez Okundu</span></div>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
