1

これは、C# プログラムでは非常に簡単に実行できますが、SQL では、できるかどうかわかりません。

私はテーブルフォーマットを持っています。このテーブルには「ファイル名」と「サイズ」があります。これらを外部キーを持つ新しいテーブル DigitalFormat に移動したいと考えています。

これまでのところ、私は簡単な部分を行ってきました:

CREATE TABLE FormatDigital
(
FormatDigitalId uniqueidentifier NOT NULL,
Filename nvarchar(MAX) NOT NULL,
Size int NOT NULL
PRIMARY KEY (FormatDigitalId)
);

ALTER TABLE Formats
ADD FormatDigital uniqueidentifier
GO

ALTER TABLE Formats
ADD CONSTRAINT FK_FormatDigital_FormatDigital FOREIGN KEY (FormatDigital)
REFERENCES FormatDigital(FormatDigitalId);

次に、Formats のすべてのレコードを取得し、FormatDigital に新しいエントリを作成して、Format.FormatDigitalId 外部キーが正しい ID を指していることを確認します。

これはSQLでできることですか?それとも、C# プログラムを接続して素晴らしいものにする必要がありますか?

4

3 に答える 3

2

次のようなことをするだけです

INSERT INTO FormatDigital
Select Filename, Size from Format

その後

UPDATE F
SET
FormatDigital = FD.FormatDigitalID
FROM
Format F
Inner Join
FormatDigital FD
on FD.FileName = F.FileName and FD.Size = F.Size

ファイル名とサイズが一意でない場合は、最初のクエリに DISTINCT を追加します。

于 2013-03-13T14:30:19.847 に答える
1

あなたが持っているように、FormatDigital テーブルを作成した後 (Identity に設定された Integer Primary Key を使用する場合を除く)

   CREATE TABLE FormatDigital
    ( FormatDigitalId integer Identity Primary Key NOT NULL,
      Filename nvarchar(MAX) NOT NULL,
      Size int NOT NULL);


   Insert FormatDigital(FileName, Size)
   Select distinct FileName, Size From Formats
   -- ----------------------------------------
   Update F Set FormatDigital =
        D.FormatDigitalId 
   From Format F Join FormatDigital D 
      On  D.Filename = F.Filename
         And D.Size = F.Size

本当にキーに Guid を使用したい場合は (これには多くの欠点があります)
、それらを後で追加してから、整数キーを削除します。

于 2013-03-13T14:40:03.350 に答える
1

まず、FormatDigitalIdデフォルトでシーケンシャル GUID を使用するように変更します。

FormatDigitalId uniqueidentifier NOT NULL DEFAULT newsequentialid()

これで、次のカーソルを使用できます。このコードは、Formats名前付きの整数の主キーがあると想定していることに注意してくださいId。そうでない場合は@nextId、適切なタイプに変更Idし、正しい名前に変更してください。

DECLARE @nextId int
DECLARE @filename nvarchar(max)
DECLARE @size int
DECLARE @newId guid

DECLARE loop CURSOR FOR
SELECT Id, Filename, Size
FROM Formats

OPEN loop
FETCH NEXT FROM loop INTO @nextId, @filename, @size

WHILE @@FETCH_STATUS = 0
BEGIN

    INSERT INTO FormatsDigital (Filename, Size) 
            OUTPUT inserted.FormatDigitalID INTO @newId 
            VALUES (@filename, @size)

    UPDATE Formats SET FormatDigitalId = @newID WHERE Id = @nextId

    FETCH NEXT FROM loop INTO @nextId, @filename, @size
END

CLOSE loop
DEALLOCATE loop
于 2013-03-13T14:42:48.827 に答える