2012-05-30 2 views
0

Я очень редко использую SQL Server, и в профессиональном контексте я все хорошо понимаю! Я работаю над проектом для домашних животных, хотя у меня проблемы с созданием скрипта.Проблемы с генерации сценариев данных

У меня есть онлайн-база данных, в которой мне нужно извлечь все. Я использую параметр Задачи> Сгенерировать сценарии в SQL Server Management Studio. Ниже приведен пример одного вставки заявления сценарий создает (у меня есть 1,000s этих вставок):

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

У меня есть две проблемы с этим:

(а) Я хочу, чтобы лишить все пробелы из двух титульных элементов (б) Я не хочу дату HEX - я хочу что-то вроде читаемый 2006-09-01 (гггг-мм-дд)

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

что бы самый быстрый способ изменить около 3000 заявлений вставки в этот пересмотренный формат?

FYI - это конструкция стола:

[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

Да, генерировать скрипты печально сценариев столбцов datetime как CONVERT (двоичное_значение, Datetime). Я попытаюсь получить ответ о том, почему (или, что более важно, если есть способ изменить поведение). Я подозреваю, что причина заключается в том, чтобы избежать каких-либо проблем с запуском скриптов на другой машине с разными языковыми/региональными настройками и т. Д. Я не знаю, есть ли способ изменить это из того, что происходит в то же время, но Management Studio не является только способ сценариев ваших данных ... вы можете посмотреть на сторонние продукты, такие как SQL Data Compare от Red-Gate.

Если это действительно всего 3000 строк, и вы намерены запустить сгенерированный скрипт на другом сервере, прекратите использовать мастер и сделайте это (на первый взгляд это выглядит ужасно, но он делает несколько вещей, которые вам понадобятся - выводит скрипт, готовый к копированию, вставке и запуску, с красиво отформатированными и читаемыми датами, вставляет в многострочные значения VALUES на 1000 с командами GO между ними и даже имеет дело с потенциально значениями 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 определенно будет правильным путем. Что касается дат, каков вывод «SELECT ReleaseDate от NewComics»? Вы уверены, что ваш скрипт создания таблицы имеет время DATETIME? – swasheck

+0

Да, определенно datetime - он все равно выходит как CAST (0x00009D4B00000000 AS DateTime). – Sniffer

Смежные вопросы