Merhaba arkadaşlar
Bu paylaşımda, Old veritabanındaki herhangi bir tabloyu,
KO_DATABASE_SERVER_001 içine tek satırda tablo adı yazarak nasıl eksiksiz kopyalayabileceğinizi anlatıyorum.
Bu script özellikle:
• USERDATA
• ACCOUNT_CHAR
• KNIGHTS_USER
• WAREHOUSE
gibi tablolarda IDENTITY hatası yaşamadan kopyalama yapmak isteyenler için birebirdir.
---
✔ Tablo adını sadece 1 yerden belirliyorsun
✔ Hedef tabloyu TRUNCATE ederek temizliyor
✔ IDENTITY kolonları otomatik dışarıda bırakıyor
✔ Old DB ile New DB arasında ortak kolonları buluyor
✔ Tüm satırları eksiksiz kopyalıyor
✔ "Cannot insert explicit value for identity column" hatası vermez
---
Aşağıdaki satırdan sadece tablo adını değiştirmeniz yeterlidir:
Kod:
DECLARE @TableName SYSNAME = 'ACCOUNT_CHAR';
Örnekler:
• USERDATA
• ACCOUNT_CHAR
• WAREHOUSE
• KNIGHTS_USER
---
Kod:
USE KO_DATABASE_SERVER_001;
GO
DECLARE @TableName SYSNAME = 'ACCOUNT_CHAR'; -- SADECE BURAYI DEĞİŞTİR
DECLARE @sql NVARCHAR(MAX) = '';
DECLARE @cols NVARCHAR(MAX) = '';
-- Ortak ve IDENTITY olmayan kolonları bul
SELECT @cols = STRING_AGG(QUOTENAME(c2.COLUMN_NAME), ', ')
FROM Old.INFORMATION_SCHEMA.COLUMNS c1
JOIN KO_DATABASE_SERVER_001.INFORMATION_SCHEMA.COLUMNS c2
ON c1.COLUMN_NAME = c2.COLUMN_NAME
WHERE c1.TABLE_NAME = @TableName
AND c2.TABLE_NAME = @TableName
AND COLUMNPROPERTY(
OBJECT_ID('KO_DATABASE_SERVER_001.dbo.' + @TableName),
c2.COLUMN_NAME,
'IsIdentity'
) = 0;
-- TRUNCATE + INSERT
SET @sql = '
TRUNCATE TABLE KO_DATABASE_SERVER_001.dbo.' + QUOTENAME(@TableName) + ';
INSERT INTO KO_DATABASE_SERVER_001.dbo.' + QUOTENAME(@TableName) + ' (' + @cols + ')
SELECT ' + @cols + '
FROM Old.dbo.' + QUOTENAME(@TableName) + ';
';
EXEC sp_executesql @sql;
GO
---
---
✔ Server taşıyanlar
✔ Backup’tan data çekenler
✔ Farm / PvP geçişi yapanlar
✔ USERDATA / ACCOUNT_CHAR kopyalama sorunu yaşayanlar
---
Umarım işinize yarar arkadaşlar,
takılan olursa konu altına yazabilir