2012-05-30 4 views
0

저는 거의 SQL Server를 사용하지 않으며 전문가적인 맥락에서 명확하게 설명합니다. 나는 애완 동물 프로젝트에서 일하고 있는데 나는 스크립트 제작에 문제가있다.데이터 스크립트 생성 문제

나는 모든 것을 추출해야하는 온라인 데이터베이스가 있습니다. SQL Server Management Studio에서 작업> 스크립트 생성 옵션을 사용합니다.

INSERT [dbo].[NewComics] ([NewComicId], [Title], [Subtitle], [ReleaseDate], [CollectionId]) VALUES (366, N'Hawk & Dove 1:                      ', N'First Strikes                      ', CAST(0x00009F6F00000000 AS DateTime), 248) 

나는이 두 가지 문제가 있습니다 : 다음은 (내가이 삽입의 1,000가) 스크립트를 생성 한 삽입 문장의 예입니다

(A) 나는 모든 공백을 제거하려면 두 제목 요소에서 (B) 나는 HEX 날짜를 원하지 않는다 - 나는 2006-09-01 (yyyy-mm-dd)이 같은 읽을 것을

INSERT [dbo].[NewComics] ([NewComicId], [Title], [Subtitle], [ReleaseDate], [CollectionId]) VALUES (366, N'Hawk & Dove 1:', N'First Strikes', '2006-09-01', 248) 

하는 변경하는 가장 빠른 방법이 될 것입니다 무엇을 원 이 수정 된 형식에 대한 약 3,000 개의 INSERT 문이 있습니까?

참고 -이 테이블의 디자인은 다음과 같습니다 사전에

[NewComicId] [int] NOT NULL, 
[Title] [nchar](100) NOT NULL, 
[Subtitle] [nchar](100) NULL, 
[ReleaseDate] [datetime] NOT NULL, 
[CollectionId] [int] NOT NULL, 

감사합니다!

+0

데이터는 어디로 이동합니까? SQL Server 버전이란 무엇입니까? 번역? 작업> 데이터 내보내기를 수행하고 플랫 파일, 엑셀 또는 다른 연결로 덤프 할 수 있어야합니다. – swasheck

+0

위의 요구 사항을 충족하는 전체 데이터베이스에 대해 SQL 파일을 작성하고 드롭하면됩니다. SQL Management Studio 2012를 사용하고 있습니다. – Sniffer

+0

데이터 정리를 원한다고 말씀하시는 겁니까? – swasheck

답변

5

예, 스크립트를 생성하면 슬프게도 datetime 열을 CONVERT (binary_value, Datetime)로 스크립팅합니다. 왜 (또는 더 중요한 것은 행동을 바꾸는 방법이 있다면) 나는 대답을 얻으려고 노력할 것입니다. 그 이유는 다른 로케일/지역 설정 등을 사용하는 다른 컴퓨터에서 스크립트를 실행하는 데 문제가 발생하지 않는다고 생각합니다. 그 동안에는 변경하지 않을 방법이 있는지 모르겠지만 Management Studio는 그렇지 않습니다. 데이터를 스크립팅하는 유일한 방법은 레드 게이트의 SQL 데이터 비교와 같은 타사 제품을 들여다 볼 수 있습니다.

정말로 3,000 개의 행이 있고 생성 된 스크립트를 다른 서버에서 실행하려면 마법사 사용을 중지하고 이것을 수행하십시오 (처음에는 끔찍한 것처럼 보이지만 원하는 몇 가지 작업을 수행합니다). 멋지게 형식화되고 읽을 수있는 날짜, 중간에 GO 명령을 사용하여 다중 행 VALUES에 배치 된 삽입 및 제목, 부제 및 collectionid에 잠재적으로 NULL 값을 처리하는 스크립트를 복사, 붙여 넣기 및 실행할 준비가 된 스크립트를 출력합니다.

DECLARE @newtable SYSNAME = 'dbo.NewComics'; 

SET NOCOUNT ON; 

;WITH x AS (SELECT TOP (4000) s = '(' 
    + CONVERT(VARCHAR(12), NewComicId) + ',' 
    + COALESCE('N''' + REPLACE(RTRIM(Title), '''', '''''') + '''', 'NULL') + ',' 
    + COALESCE('N''' + REPLACE(RTRIM(SubTitle), '''', '''''') + '''', 'NULL') 
    + ', ''' + CONVERT(CHAR(8), ReleaseDate, 112) + ' ' 
    + CONVERT(CHAR(8), ReleaseDate, 108) + ''',' 
    + CONVERT(VARCHAR(12), COALESCE(CollectionId, 'NULL')) + ')', 
    rn = ROW_NUMBER() OVER (ORDER BY NewComicId) 
    FROM dbo.OldComics ORDER BY NewComicId 
), 
y AS 
(
SELECT [/*a*/] = 1, [/*b*/] = 'SET NOCOUNT ON; 
GO 
INSERT ' + @newtable + ' VALUES' 
UNION ALL 
SELECT 2, s = CASE WHEN rn > 1 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 1 AND 1000 
UNION ALL 
SELECT 3, 'GO' UNION ALL 
SELECT 4, s = CASE WHEN rn > 1001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 1001 AND 2000 
UNION ALL 
SELECT 5, 'GO' UNION ALL 
SELECT 6, s = CASE WHEN rn > 2001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 2001 AND 3000 
UNION ALL 
SELECT 7, 'GO' UNION ALL 
SELECT 8, s = CASE WHEN rn > 3001 THEN ',' ELSE '' END + s 
FROM x WHERE rn BETWEEN 3001 AND 4000 
) 
SELECT [/*b*/] FROM y ORDER BY [/*a*/]; 

(정확히 3000 또는 3001 개의 행이있는 경우이 설정을 사용하거나 4,000 개가 넘는 경우 다른 조합을 추가해야 할 수 있습니다.))

동일한 인스턴스의 다른 데이터베이스 나 다른 데이터베이스로 데이터를 이동하는 경우 @swasheck가 제공 한 스크립트를 사용하십시오 (다시 마법사 사용을 중지하십시오).

일반적인 추세를 여기에서 알았을 수 있습니다. 에 대해 출력하는 바이너리 형식이 마음에 들지 않으면 스크립트 생성 마법사 사용을 중지하십시오.

+0

굉장! - 이것이 내가 원하는 것이고, 나는 그것을 몇 번이고 다시 사용할 수 있습니다. 많은 감사 Aaron! – Sniffer

2

그래서이 날이라면, 내가 무엇을 할 줄은 별도의 데이터베이스에서 테이블 구조를 구축하는 것입니다 :

CREATE TABLE NewComics (
[NewComicId] [int] identity (0,1) NOT NULL, 
[Title] [nvarchar](100) NOT NULL, 
[Subtitle] [nvarchar](100) NULL, 
[ReleaseDate] [datetime] NOT NULL, 
[CollectionId] [int] NOT NULL 
); 

ALTER TABLE [NewComics] 
ADD CONSTRAINT PK_NewComicsID PRIMARY KEY; 

그리고 다음과 같이 데이터를 정리하는 SQL을 사용

INSERT INTO [NewDatabase].[dbo].[NewComics] (Title, Subtitle, ReleaseDate, CollectionID) 
SELECT 
    LTRIM(RTRIM(Title)) 
    , LTRIM(RTRIM(Subtitle)) 
    , CAST(ReleaseDate as Datetime) 
    , CollectionID 
FROM [OldDatabase].[dbo].[NewComics]; 
을 의 소스로

SELECT 
    NewComicID 
    , LTRIM(RTRIM(Title)) 
    , LTRIM(RTRIM(Subtitle)) 
    , CAST(ReleaseDate as Datetime) 
    , CollectionID 
FROM [OldDatabase].[dbo].[NewComics]; 

:

또는이 같은 SELECT 쿼리를 사용할 수 있습니다 데이터 가져 오기/내보내기 작업 (예 : Generate Scripts과 동일한 메뉴) 이 서버의 [OldDatabase]이 원본이되고이 서버의 [NewDatabase]이 대상이됩니다. 모든 신원 삽입물의 확인란을 선택하십시오.

+0

확인. 이것은 정말로 작동하지 않았지만, 나에게 거기에서 일부 길을 줬다! [제목]과 [자막]을 nvarchar로 변경 한 다음 공백을 제거했습니다. 날짜는 여전히 yyyy-mm-dd가 아닌 16 진수 날짜로 전달됩니다. 어떤 아이디어? – Sniffer

+0

와우. 그걸 알지도 못 했어. NVARCHAR은 확실히 올바른 길입니다. 날짜에 관해서는,'SELECT ReleaseDate from NewComics'의 결과는 무엇입니까? 당신의 테이블 생성 스크립트가'DATETIME' 시간인가요? – swasheck

+0

네, 확실히 datetime - 그것은 여전히 ​​CAST (0x00009D4B00000000 AS DateTime)로 나오고 있습니다. – Sniffer