2012-05-30 32 views
0

我很少使用SQL Server,並且在專業環境中我保持清晰!我正在做一個寵物項目,但我在創建腳本時遇到了問題。數據腳本生成問題

我有一個在線數據庫,我需要從中提取所有內容。我使用SQL Server Management Studio中的任務>生成腳本選項。以下是腳本創建一個INSERT語句的例子(我有這些刀片的1000個):

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

我有兩個問題與此:

(一)我想要去除所有的空白從兩個標題元素 (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個插入語句修改爲這種格式?

僅供參考 - 這是表的設計:提前

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

謝謝!

+0

在哪裏數據變?什麼是SQL Server版本?版?你應該能夠做到任務>導出數據,並將其轉儲到平面文件,Excel或一些其他連接 – swasheck

+0

我只想做一個下降,與上述要求整個數據庫中創建SQL文件。我正在使用SQL Management Studio 2012. – Sniffer

+0

所以你說你想清理數據? – swasheck

回答

5

是的,生成腳本可悲腳本日期時間列作爲CONVERT(binary_value,Datetime)。我會盡力爲什麼(或者更重要的是,如果有改變行爲的方法)得到答案。我懷疑原因是爲了避免在具有不同語言環境/區域設置等的不同計算機上運行腳本的任何問題。我不知道是否有辦法改變發生的同時,但Management Studio不是隻有腳本才能編寫數據......您可以查看Red-Gate的SQL Data Compare等第三方產品。

如果它真的只有3000行,並且您打算在不同的服務器上運行生成的腳本,請停止使用該向導並執行此操作(乍一看,這看起來很可怕,但它會執行一些您想要的操作 - 輸出一個腳本,準備好複製,粘貼和運行,具有格式良好且可讀的日期,通過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行,您可能必須使用它,或者如果您有超過4000個等等,請添加另外幾個聯合。)

如果你將數據移動到同一實例上不同的表或不同的數據庫,使用@swasheck提供(並再次腳本,停止使用嚮導)。

您可能已經注意到這裏有一個共同的趨勢:如果您不喜歡在日期上輸出的二進制格式,請停止使用生成腳本嚮導。

+0

太棒了! - 這正是我需要的,我可以一次又一次地使用它。非常感謝亞倫! – 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查詢:

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

爲源動力導入/導出數據任務(在您用於Generate Scripts的相同菜單中)。該服務器上的[OldDatabase]將是該服務器的源,並且該服務器上的[NewDatabase]將是目的地。確保您選中了所有身份插入的框。

+0

確定。這並沒有真正的工作,但讓我在那裏的一部分!我不得不將[Title]和[Subtitle]更改爲nvarchar,然後剝去空白空間!日期雖然仍以十六進制日期顯示,而不是yyyy-mm-dd。有任何想法嗎? – Sniffer

+0

哎呦。甚至沒有注意到這一點。 NVARCHAR絕對是正確的選擇。至於日期,「NewComics的SELECT ReleaseDate」的輸出是什麼?你確定你的表創建腳本的時間是'DATETIME'嗎? – swasheck

+0

是的,絕對的日期時間 - 它仍然現身爲CAST(0x00009D4B00000000爲DATETIME)雖然。 – Sniffer