SQL Server:在存储过程中插入游标

时间:2016-04-11 01:54:34

标签: sql sql-server stored-procedures cursor

我是SQL Server的新手,我被赋予了一个任务,我必须使用游标来复制Phone Link表的记录。我设法复制的其他表,无需使用游标。但是,我有Phone Link表的主键约束问题。有人请帮助我吗?谢谢。以下是我的存储过程。 Intake参数是comp_companyid。我的要求是将每一列复制到同一个表中并生成新的主键&外键。

P / S:

  • EntityID = 5(公司)
  • EntityID = 13(人)

因为我有人电话&人手机链接也可以在之后添加。但我只需先解决这个问题,然后在我打电话的时候可以参考这个。

另外,一家公司可以有多人,地址。

#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()

感谢您是否可以告诉我哪个部分我做错了。感谢您提前花时间和精力!

1 个答案:

答案 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,对于所有插入的行都是相同的。)