将SQL列移动到新表中的新条目

时间:2013-03-13 14:24:51

标签: sql sql-server-2008 sql-update

这是我在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#程序并且很棒?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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作为钥匙,(这有很多不足之处。)
稍后添加,然后删除整数键

答案 2 :(得分: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