【问题标题】:How to call a stored procedure inside a case如何在案例中调用存储过程
【发布时间】:2019-01-22 22:06:10
【问题描述】:

我想在 case 语句中执行一个存储过程,但我卡住了,因为我不能像以前用 IF 语句那样执行两件事!这是我的代码:

CREATE OR ALTER PROCEDURE dbo.selectBooks
as 
begin

  DECLARE @ArchivedBooks AS TABLE ([Books] varchar(100))

  INSERT INTO @ArchivedBooks(Books)
  select name 
  FROM ArchivedBooks

  SELECT id, 
         bookId, 
         name,
         CASE 
         WHEN (name IN (SELECT Books FROM @ArchivedBooks)) THEN 'archivedBook' 
         // but i want also to execute a stored procedure that will insert the 
         book
         exec dbo.insertBook @name;
        ELSE 'noArchivedBook' as status
  FROM books
end

【问题讨论】:

  • SQL Server 中的 CASE 不是语句,而是表达式。 CASE 表达式 只能返回一个标量值,它们不能执行存储过程。如果您希望从 SP 返回值,最好使用函数(内联表值函数 tend 性能更好)。如果您发布您的 SP dbo.insertBook 的 DDL,我们应该能够为您提供进一步的帮助;但是,您的 SP 的名称暗示您想要INSERT 一些数据,您*不能在CASE 表达式中(或在@987654327 @ 声明)。
  • 简答:你不能这样做。更长的答案:将名称写入临时表(以名称作为主键),然后使用 WHILE LOOP 为表中的每一行调用存储过程。或者,如果必须,请使用 FAST_FORWARD 游标。

标签: sql-server stored-procedures


【解决方案1】:

你问的是不可能的。您需要单独检查并插入该书。例如:

CREATE OR ALTER PROCEDURE dbo.selectBooks
AS
BEGIN
    DECLARE @ArchivedBooksAS TABLE ([Books] varchar(100))

    INSERT INTO @ArchivedBooks(Books)
    SELECT name 
    FROM ArchivedBooks

    IF NOT EXIST (SELECT 0 FROM @ArchivedBooks WHERE Books = @name)
        BEGIN
            EXEC dbo.insertBook @name
        END
    SELECT id, 
           bookId, 
           name,
           CASE WHEN @ArchivedBooks.Book
                IS NULL THEN 'noArchiveBook'
                ELSE 'archivedBook'
                END AS Status
    FROM books
    LEFT JOIN @ArchivedBooks ON @ArchivedBooks.Book = Books.Book
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2013-11-11
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多