【发布时间】:2016-08-15 09:09:33
【问题描述】:
我需要帮助来创建一个带参数的插入存储过程,如果传递该参数的值,那么它必须在数据库中插入或更新,否则它应该使用默认值为零。
我的问题是,当我使用SampleID = 0 执行下面的代码时,它可以工作......任何其他SampleID 什么都不做。
提前致谢
存储过程的执行:
SET NOCOUNT OFF
EXEC SP_Samples '0', '3' ,'Pink'
GO
存储过程代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_Samples]
(@SamplesID int,
@SamplesCategoriesID int,
@SamplesName nvarchar(50)
)
AS
BEGIN
SET NOCOUNT ON;
IF (@SamplesID = 0)
BEGIN
INSERT INTO tblSamples ([SamplesName], [SamplesCategoriesID])
VALUES (@SamplesName, @SamplesCategoriesID)
END
ELSE
BEGIN
UPDATE [tblSamples]
SET SamplesCategoriesID = @SamplesCategoriesID,
SamplesName = @SamplesName
WHERE SamplesID = @SamplesID
END
END
【问题讨论】:
-
您遇到了一些问题。两个参数是 int 但您传入的是 varchar 值。调用时丢失数字参数值周围的双引号。当您传递一个非零值时,它会运行更新。我敢肯定它运行得很好。什么行为让你认为它什么也没做?你的测试用例是什么?例如,您是否有可以测试的
SamplesID=1的现有记录? -
感谢尼克,删除引号起到了作用……SP 现在正在插入非零 ID 的记录。感谢编辑代码复制/粘贴
-
我不知道它是怎么做到的......它只命中 0 值的插入代码
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
谢谢马克,会的。 PS-感谢代码编辑,在我的下一篇文章中注明,谢谢
标签: sql-server stored-procedures