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