2011-10-06 156 views
-1

我试图根据Project_CSTM表中的数据更新Contacts_CSTM表中的数据。这是我使用的查询,但我得到一个错误:更新选择语句多连接

ALTER PROCEDURE Insurance_Check_Expiration 
    @ID_C AS NVARCHAR (55) = ID_C 
    AS 
BEGIN  
SET NOCOUNT ON 
IF EXISTS(SELECT * FROM CONTACTS_CSTM WHERE ID_C = @ID_c) 

Update contacts_cstm set insurance_expired_label_c = 'INSURANCE EXPIRED' 
WHERE DRIVERS_LICENSE_NUMBER_C IS NOT NULL AND @ID_C= 
(SELECT cc.id_c 
FROM PROJECT_CSTM PC 
JOIN PROJECT P 
ON P.ID = PC.ID_C 
JOIN PROJECT_RELATION PR 
ON PR.PROJECT_ID = P.ID 
JOIN CONTACTS C 
ON C.ID = PR.RELATION_ID 
JOIN CONTACTS_CSTM CC 
ON CC.ID_C = C.ID 
WHERE CC.ID_C = @ID_C AND INSURANCE_EXPIRED_C ='1') 

谢谢“从字符串转换为uniqueidentifier时转换失败”。

+0

听起来像是你是一个GUID比较字符串值...你能告诉使用的列及其数据类型? – AJC

回答

1

其中之一,你将@ID_C的值设置为一个值(ID_C),这显然不是有效的GUID。

这是您所做的功能等同物,运行它,您将得到相同的错误。

CREATE PROCEDURE Insurance_Check_Expiration 
    @ID_C AS NVARCHAR (55) = ID_C 
    AS 
BEGIN  
DECLARE @A UNIQUEIDENTIFIER 

SET @A = @ID_C 


END 

exec Insurance_Check_Expiration 

编辑:这是一个基于业务方案的意见的功能例如:

CREATE TABLE GUIDExample (ID_C UNIQUEIDENTIFIER) 
GO 
CREATE PROC GuidExample_Insert @ID_C UNIQUEIDENTIFIER 
AS 
BEGIN 
    SELECT @ID_C 
END 
GO 
CREATE TRIGGER GUID_Example ON GUIDExample 
AFTER INSERT 
AS 
    DECLARE @ID_C UNIQUEIDENTIFIER 

    SELECT @ID_C = ID_C 
    FROM Inserted 


    EXEC GuidExample_Insert @ID_C 
GO 

DECLARE @SampleGUID UNIQUEIDENTIFIER 

SET @SampleGUID = NEWID() 

INSERT GUIDExample (ID_C) 
VALUES(@SampleGUID) 
+0

感谢您的输入Wil。我与w/SQL斗争,也许你可以帮助我理解。如何编写更新语句,以便只更新包含记录ID的记录?这个问题有意义吗? – Stan

+0

proc设置为接受输入参数。在'ALTER PROCEDURE'之后将'@ID_C = ID_C'更改为'@ ID_C',并确保在调用时将有效的GUID传递给过程。你的过程调用应该看起来像'EXEC Insurance_Check_Expiration'你试图通过的GUID'。它可能是一个变量,它可能是一个应用程序的参数,只要它是一个唯一标识符就可以工作。更好的是,如果这是传入proc的值实际上是什么,那么将@ID_C从'NVARCHAR(55)'更改为'UNIQUEIDENTIFER'。 – Wil

+0

修改过程之后,我有@ID_C AS UNIQUEIDENTIFIER。 EXEC Insurance_Check_Expiration是触发器,是我把EXEC Insurance_Check_Expiration @ID_C放在哪里?我知道我表现出我的无知,但除非你提出问题,否则你不会学习,不管他们多么愚蠢。我喜欢你的帮助Wil – Stan