【发布时间】:2017-05-12 13:50:02
【问题描述】:
我想插入一条记录,然后用存储过程返回该记录的详细信息:
USE
TEST
GO
CREATE PROCEDURE AddProject(
-- In
@_title NVARCHAR(200),
@_description NVARCHAR(MAX),
-- Out
@Title NVARCHAR(200) OUT,
@Description NVARCHAR(MAX) OUT)
AS
BEGIN
SELECT
[ProjectsTable.ProjectID],
[Title],
[Description]
FROM
(INSERT INTO [Projects] ("Title", "Description")
OUTPUT inserted.ProjectID
VALUES (@_title, @_description)) ProjectsTable
END
我收到此错误,我做错了什么?
消息 10729,级别 15,状态 1,过程 AddProject,第 31 行
SELECT 语句中不允许嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句不是 INSERT 语句的行的直接源。
感谢回答:
程序最终是这样的:
USE
TEST
GO
CREATE PROCEDURE AddProject(
-- In
@_title NVARCHAR(200),
@_description NVARCHAR(MAX),
-- Out
@ProjectID INT OUT,
@Title NVARCHAR(200) OUT,
@Description NVARCHAR(MAX) OUT
)
AS
BEGIN
BEGIN TRAN
INSERT INTO
[Projects]
("Title", "Description")
VALUES
(@_title, @_description)
SET @ProjectID = SCOPE_IDENTITY();
SELECT
@Title = [Title],
@Description = [Description]
FROM
[Projects]
WHERE
[Projects].[ProjectID] = @ProjectID
COMMIT
END
我这样称呼它:
Declare @ProjectID as INT
Declare @Title as NVARCHAR(200)
Declare @Description as NVARCHAR(MAX)
EXEC AddProject "Test project", "A test project", @ProjectID output, @Title output, @Description output
SELECT @ProjectID, @Title, @Description
【问题讨论】:
-
返回您传入的相同数据的目的是什么?
-
先插入,再获取ID的
SCOPE_IDENTITY(),再返回Select语句。但我同意@George2.0Hope。 -
@George2.0Hope - 注意从 INSERT 的 OUTPUT 中获取的额外 ProjectID
-
@Hybris95 为您提供了正确的解决方案,令人困惑的是您的 SPROC 声明没有 ProjectID 的输出声明(或者像 Hybris95 或 WEI_DBA 我会推荐 SCOPE_IDENTITY()).. . 但是,当我执行此操作时,我将其包装在事务中并返回 @@ERROR;因为检索 ID 很重要,但如果它失败了要优雅地处理它。
标签: sql-server stored-procedures