我是SQL Server的新手,我被赋予了一个任务,我必须使用游标来复制Phone Link表的记录。我设法复制的其他表,无需使用游标。但是,我有Phone Link表的主键约束问题。有人请帮助我吗?谢谢。以下是我的存储过程。 Intake参数是comp_companyid。我的要求是将每一列复制到同一个表中并生成新的主键&外键。
P / S:
因为我有人电话&人手机链接也可以在之后添加。但我只需先解决这个问题,然后在我打电话的时候可以参考这个。
另外,一家公司可以有多人,地址。
#Allow the user to enter the input and output file names
inputFileName = input("Input file name: ")
outputFileName = input("Output file name: ")
#Open the input and output files
infile = open(inputFileName,"r")
outfile = open(outputFileName, "w")
#Define count
count=0
#Reads the input file and produces the output file
line = infile.readline()
while line != "":
count = count+1
print(count, line)
line = infile.readline()
#Close the infile and the outfile
infile.close()
outfile.close()
感谢您是否可以告诉我哪个部分我做错了。感谢您提前花时间和精力!
答案 0 :(得分:0)
不确定所有插入列的含义,但如果要插入多行,则需要为每行生成另一个唯一ID。因此,您必须将ID生成代码移动到游标主体中,而不是将其放在游标声明之前,并在每次迭代时调用此生成器。
...
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @c_PLink_LinkID = crm_next_id 10208
EXEC @c_PLink_PhoneId = crm_next_id 14
INSERT INTO PhoneLink
(
PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp,
PLink_EntityID, PLink_RecordID, PLink_Type
)
VALUES
(
@c_PLink_LinkID, @c_PLink_PhoneId, @c_PLink_CreatedBy, @c_PLink_CreatedDate, @c_PLink_UpdatedDate, @c_PLink_TimeStamp,
@c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type
)
FETCH NEXT FROM @getPLID
INTO @c_PLink_CreatedBy, @c_PLink_CreatedDate, @c_PLink_UpdatedDate,
@c_PLink_TimeStamp, @c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type
END
如果还需要生成PhoneID,则必须将其放在光标内。 同时从游标的select中删除PLink_LinkID和PLink_PhoneId,因为您不需要原始值。当然,从获取列表中删除'em。如上所示。
但是,
如果我的假设是正确的那么你会走错路。如果PhoneLink
表是将某些电话链接到新创建的实体/公司的表,那么您需要先复制电话(并为该记录生成ID),然后再建立新Phone_ID与新Company_ID之间的链接。
现在,如果你每个公司只有一部电话(这有点奇怪),那么你就不需要光标了。但是,如果每个公司可以拥有多部手机,那么您需要生成几个新的Phone_ID。这意味着,您需要遍历电话和链接,而不是仅迭代链接。代码应如下所示:
...
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @c_PLink_LinkID = crm_next_id 10208
EXEC @c_PLink_PhoneId = crm_next_id 14
INSERT INTO Phone
(
Phon_PhoneId, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, Phon_UpdatedBy, Phon_UpdatedDate, Phon_TimeStamp
)
SELECT @PhoneID, Phon_Number, Phon_CreatedBy, Phon_CreatedDate, '1', GETDATE(), Phon_TimeStamp
FROM Phone
WHERE Phon_PhoneId = @Old_Phone_ID
INSERT INTO PhoneLink
(
PLink_LinkID, PLink_PhoneId, PLink_CreatedBy, PLink_CreatedDate, PLink_UpdatedDate, PLink_TimeStamp,
PLink_EntityID, PLink_RecordID, PLink_Type
)
VALUES
(
@c_PLink_LinkID, @c_PLink_PhoneId, @c_PLink_CreatedBy, @c_PLink_CreatedDate, @c_PLink_UpdatedDate, @c_PLink_TimeStamp,
@c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type
)
FETCH NEXT FROM @getPLID
INTO @Old_Phone_ID, @c_PLink_CreatedBy, @c_PLink_CreatedDate, @c_PLink_UpdatedDate,
@c_PLink_TimeStamp, @c_PLink_EntityID, @c_PLink_RecordID, @c_PLink_Type
END
注意,我将@Old_Phone_ID
返回到获取列表中 - 因此您可以按ID找到已复制的手机。在这种情况下不再需要最后一个insert-select-phone(在许多手机套件中实际上是不正确的'因为它插入了标量@PhoneID,对于所有插入的行都是相同的。)