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 表之后,就像你一样,(除了使用整数主键,设置为身份)

   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 回答