我有一张表如下。 表名:TESTNUMBERS
ID(INT) NUMBER(INT) NAME(NVARCHAR(50))
1 1 Test
2 1 Test
3 2 Test2
当我插入NUMBER列时,我需要增加,如果不可用,如果可用,那么最大id值+ 1,并确保数字是否作为参数传递,然后保存原样。(这是为了确保约束NAME为相同的行也会有相同的NUMBER列。
我写了一篇SP但有一些语法问题。
CREATE PROCEDURE TEST_STOREDPROC
@Name NVARCHAR(50),
@Number INT = 0,
@ID INT
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
DECLARE @IncrementID SMALLINT; SET @IncrementID=1;
DECLARE @IncrementNumber INT; SET @IncrementNumber = 1;
BEGIN TRAN
BEGIN
IF @Number = 0
BEGIN
SET @Number =
SELECT ISNULL(MAX(Number),0)+@IncrementNumber
from TESTNUMBERS
END
INSERT INTO TESTNUMBERS
([ID]
,[Name]
,[Number])
SELECT ISNULL(MAX([ID]),0)+@IncrementID as [ID]
,@Name
,@Number
FROM TESTNUMBERS
--return the ID of the column inserted
SELECT MAX([ID]) from TESTNUMBERS
END
COMMIT TRAN
END TRY
BEGIN CATCH
--TO DO
END CATCH
END
GO
如何改进和纠正此SP?
答案 0 :(得分:0)
CREATE PROCEDURE SP_TEST
@Name NVARCHAR(50),
@Number INT = 0,
@ID INT
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
DECLARE @IncrementID SMALLINT; SET @IncrementID=1;
DECLARE @IncrementNumber INT; SET @IncrementNumber = 1;
BEGIN TRAN
BEGIN
IF @Number = 0
*BEGIN
**SET @Number =(SELECT ISNULL(MAX(Number),0)+@IncrementNumber from TESTNUMBERS)***
END
INSERT INTO TESTNUMBERS
([ID]
,[Name]
,[Number])
SELECT ISNULL(MAX([ID]),0)+@IncrementID as [ID]
,@Name
,@Number
FROM TESTNUMBERS
--return the ID of the column inserted
SELECT MAX([ID]) from TESTNUMBERS
END
COMMIT TRAN
END try
**BEGIN CATCH
ROLLBACK TRAN
END CATCH**
end
您的存储过程中存在两个语法错误
当您通过sql select query为任何变量赋值时,您必须添加圆括号。
我想你在尝试阻止之后忘记了阻塞阻塞,这是必要的其他谁将捕获你的异常并在错误后进行必要的事务:),另外你的程序有良好的逻辑,继续保持。对于语法谷歌有... ....
答案 1 :(得分:0)
试试这个 -
CREATE PROCEDURE dbo.usd_TEST_STOREDPROC
@Name NVARCHAR(50)
, @Number INT = 0
, @ID INT
AS BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE
@IncrementID SMALLINT = 1
, @IncrementNumber INT = 1
BEGIN TRAN BEGIN
SELECT @Number = ISNULL(MAX(Number), 0) + @IncrementNumber
FROM dbo.TESTNUMBERS
WHERE @Number = 0
INSERT INTO dbo.TESTNUMBERS([ID], [Name], [Number])
SELECT
ISNULL(MAX([ID]), 0) + @IncrementID
, @Name
, @Number
FROM dbo.TESTNUMBERS
SELECT MAX([ID])
FROM dbo.TESTNUMBERS
END
COMMIT TRAN
END TRY
BEGIN CATCH
END CATCH
END