0

私はSQLServerを使用することはめったになく、専門的な文脈では明確にしています。私はペットプロジェクトに取り組んでいますが、スクリプトの作成に問題があります。

私はすべてを抽出する必要があるオンラインデータベースを持っています。SQL ServerManagementStudio内で[タスク]>[スクリプトの生成]オプションを使用します。以下は、スクリプトが作成する1つの挿入ステートメントの例です(これらの挿入は1,000個あります)。

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

これには2つの問題があります。

(a)2つのタイトル要素からすべての空白を削除したい(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,

前もって感謝します!

4

2 に答える 2

5

はい、スクリプトを生成します。悲しいことに、日時列をCONVERT(binary_value、Datetime)としてスクリプト化します。理由(または、動作を変更する方法がある場合はさらに重要なこと)についての回答を得ようとします。その理由は、ロケールや地域の設定などが異なる別のマシンでスクリプトを実行する際の問題を回避するためだと思います。それを変更する方法があるかどうかはわかりませんが、ManagementStudioはそうではありません。データをスクリプト化する唯一の方法...Red-GateのSQLDataCompareなどのサードパーティ製品を調べることができます。

実際には3,000行しかなく、生成されたスクリプトを別のサーバーで実行する場合は、ウィザードの使用を停止してこれを実行します(一見するとこれは恐ろしいように見えますが、必要なことのいくつかを実行します-スクリプトを出力しますコピー、貼り付け、実行の準備ができており、適切にフォーマットされて読みやすい日付で、GOコマンドを間に挟んで1000ずつ複数行の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が提供するスクリプトを使用します(また、ウィザードの使用を停止します)。

ここで一般的な傾向に気付いたかもしれません。日付に対して出力されるバイナリ形式が気に入らない場合は、スクリプトの生成ウィザードの使用を停止してください

于 2012-05-31T20:44:30.867 に答える
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]、このサーバーでは宛先になります。すべてのID挿入のチェックボックスをオンにしてください。

于 2012-05-31T19:07:04.963 に答える