我需要一些帮助。下面的存储过程似乎与现有的唯一标识符
不匹配ALTER PROCEDURE [dbo].[spInsertUpdateThisStuff]
@Id uniqueidentifier OUTPUT,
@Content nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @tAudit table (id uniqueidentifier)
IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
-- UPDATE
BEGIN
UPDATE [dbo].[myData]
SET [ID] = @ID,
[Content] = @Content
OUTPUT inserted.[ID] INTO @tAudit
WHERE [ID] = @Id
SELECT id FROM @tAudit
END
ELSE
BEGIN
-- INSERT
SET @ID = NEWID()
INSERT INTO [dbo].CBData ([ID], [Content])
OUTPUT inserted.[ID] INTO @tAudit
VALUES(@Id, @Content)
SELECT id FROM @tAudit
END;
SET @ID = (SELECT id FROM @tAudit);
END
C#
cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = (currentRecord.ID == null) ? Guid.Empty : currentRecord.ID;
cmd.Parameters["@ID"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
currentRecord.ID = Guid.Parse(cmd.Parameters["@ID"].Value.ToString());
似乎第一个IF语句永远不会成为现实,但如果使用匹配的UID测试(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id
),它将返回数据。
答案 0 :(得分:1)
这句话有问题,
DECLARE @tAudit table (id uniqueidentifier)
IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
-- UPDATE
BEGIN
@id
是一个输出参数,默认为null,您正在尝试检查..
基本上NEWID()
不会重复,因此更新部分是多余的
答案 1 :(得分:0)
您如何在代码中声明参数?是ParameterDirection.Output
吗?
尝试将其更改为ParameterDirection.InputOutput
。你的SQL看起来没问题。并且可以将输入值传递给存储过程中声明为OUTPUT
的参数。所以也许只是ParameterDirection
。
您也可以更改此
IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
到
IF @Id IS NOT NULL AND EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)
如果您的ID列无法使用,那么无论哪种方式都可以使用相同的ID列。但这更加明确,表明它已经认识到@Id可能是null,因为它是一个OUTPUT参数。
答案 2 :(得分:0)
这是我的修复。 这是我的新存储过程
ALTER PROCEDURE [dbo].[spInsertUpdatemyData]
@ID uniqueidentifier,
@IDOut uniqueidentifier OUTPUT,
@CONTENT nvarchar(255)
AS
BEGIN
--SET NOCOUNT ON;
DECLARE @tAudit table (outputID uniqueidentifier)
IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @ID)
-- UPDATE
BEGIN
UPDATE [dbo].[CBData]
SET [ID] = @ID,
[Content] = @Content
OUTPUT inserted.[ID] INTO @tAudit
WHERE [ID] = @ID
SELECT outputID FROM @tAudit;
END
ELSE
BEGIN
-- INSERT
INSERT INTO [dbo].myData
([ID],[Content])
OUTPUT inserted.[ID] INTO @tAudit
VALUES(NEWID(),@Content);
SELECT outputID FROM @tAudit
END;
set @IDOut = (SELECT outputID FROM @tAudit);
END
和相对C#
//Add Parameter for output to sql command then Change Direction of parameter
cmd.Parameters.Add("@IDOut", SqlDbType.UniqueIdentifier).Value = Guid.Empty ;
cmd.Parameters["@IDOut"].Direction = ParameterDirection.InputOutput;
cmd.ExecuteNonQuery();
currentRecord.ID = Guid.Parse(cmd.Parameters["@IDOut"].Value.ToString());
cmd.Transaction.Commit();