2017-03-22 1 views
1

기존 데이터베이스의 데이터와 함께 "삽입"쿼리를 제공하지만 각 테이블의 ID로 정렬 된 상위 1000 개의 행만 제공하는 스크립트를 생성하고 싶습니다. Management Studio (MyDatabaseName -> Tasks -> Generate scripts ...)에있는 "Generate scripts ..."를 사용하여 단일 테이블에 대한 쿼리를 생성하려고 시도한 다음 C#에서 간단한 함수를 작성했습니다. 1000 첫 번째 행에 대한 데이터를하지만 스크립트는 아래에 또 다른 빈 데이터베이스에 복사 천 개 임의 기록을 가지고 소스 데이터베이스의 모든 테이블에 대한 문을 생성 테이블SQL 고급 스크립팅 옵션

List<string> script = File.ReadLines(@"script.sql").Take(1000).ToList(); 
File.WriteAllLines(@"top1000.sql", script); 
+2

좋은 아이디어 인 것 같습니다. 자, 뭐가 잘못 됐니? 당신은 무언가를 시도했으나 효과가 없었습니까? 저희에게 알려주십시오. 1) 시도한 것 2) 결과가 무엇입니까 3) 왜이 결과가 받아 들여지지 않는지 – Will

+1

외래 키를 고려해야합니까? –

+0

당신이 볼 수 있습니다 [여기] (http://stackoverflow.com/questions/8668511/how-can-i-select-top-500-rows-from-table1-and-insert-them-to-table2) . 이것은 당신을 도울 것입니다. –

답변

1

의 수백이있을 때 그것은 좋은 생각이 아니다.

"select * insert into ..."문은 대상 테이블이 아직 존재하지 않는 경우에만 작동합니다.

ORDER BY는 테이블의 기본 키를 사용합니다.
하나가있는 경우.

SELECT CONCAT('SELECT ', 
'TOP 1000 ', 
'* INSERT INTO ', 
'[TargetDb]', -- replace with the name of the database you want to copy to 
'.',QUOTENAME(t.TABLE_NAME), 
' FROM ',QUOTENAME(t.TABLE_SCHEMA),'.',QUOTENAME(t.TABLE_NAME), 
' ORDER BY ' + QUOTENAME(k.PrimaryKeyName),';' 
) as InsertStatement 
FROM INFORMATION_SCHEMA.TABLES t 
LEFT JOIN (
    SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME as PrimaryKeyName 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(CONSTRAINT_SCHEMA) + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1 
) k ON (t.TABLE_SCHEMA = k.TABLE_SCHEMA and t.TABLE_NAME = k.TABLE_NAME) 
WHERE t.TABLE_TYPE = 'BASE TABLE' 
AND t.TABLE_SCHEMA = 'dbo' -- replace with the name of the source database you want to copy from 

ORDER BY t.TABLE_SCHEMA, t.TABLE_NAME;