【问题标题】:SQL Server: return the result of a select as a result of stored procedure executionSQL Server:作为存储过程执行的结果返回选择的结果
【发布时间】:2017-06-16 13:43:18
【问题描述】:

我有一个从 C# 调用的存储过程:

CREATE PROCEDURE [MySP] 
    @ID int,
    @Exists bit OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SET @Exists = 0

    SELECT TOP 1 ID 
    FROM MyTable 
    WHERE ID = @ID

    IF @@ROWCOUNT = 0
    BEGIN
        SELECT b.*
        FROM AnotherTable b
        INNER JOIN AnotherTable2 c ON b.ID = c.ID
        WHERE b.ID = @ID            
   END
   ELSE
   BEGIN
       SET @Exists = 1

       SELECT TOP 0 NULL
   END
END

如果表MyTable中不存在@ID,则返回SELECT b.*,否则如果表中存在@ID,则不返回任何行

问题是当表中存在@ID时,存储过程将两个表作为结果返回给C#,一个来自SELECT TOP 1,另一个来自SELECT b.*,我只想返回SELECT b。 * 那我该怎么做呢?

【问题讨论】:

    标签: c# sql-server-2008 stored-procedures


    【解决方案1】:

    只需将所有逻辑替换为:

    SELECT b.*
    From AnotherTable b INNER JOIN
         AnotherTable2 c
         ON b.ID = c.ID
    WHERE b.ID = @ID AND
          NOT EXISTS (SELECT 1 FROM MyTable WHERE ID = @ID);
    

    而且,如果您不想重复,您不妨这样做:

    SELECT b.*
    From AnotherTable b 
    WHERE b.ID = @ID AND
          EXISTS (SELECT 1 FROM AnotherTable2 c WHERE b.ID = c.ID) AND
          NOT EXISTS (SELECT 1 FROM MyTable WHERE ID = @ID);
    

    然后,了解表值函数。如果你想返回一个表,那么最好的方法——如果可行的话——是一个函数,而不是一个存储过程。 (函数的功能受到更多限制,因此这并不总是可行的。)

    【讨论】:

    • 这种方法的问题是必须执行整个选择,我想要的是避免执行不必要的选择并在之前的选择(选择顶部 1...)返回行时生成不必要的 sql server 工作.您说的这种方法也可以使用 MyTable 的左连接和 where 子句过滤器来完成: where mytable.column is NULL。但是这种方法不喜欢我,因为正如我所说,您使 sql server 工作处理和不必要的选择。
    • @user1624552 。 . .在得出(不正确的)结论之前,您应该运行查询并查看 SQL Server 如何优化它们。
    【解决方案2】:

    此用途存在:

    CREATE PROCEDURE [MySP] 
        @ID int,
        @Exists bit OUTPUT
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
       SET @Exists = 0
    
    
       IF EXISTS(SELECT TOP 1 ID FROM MyTable WHERE ID = @ID)
       BEGIN
            SELECT b.*
            From   AnotherTable b
                   INNER JOIN AnotherTable2 c on b.ID = c.ID
            Where  b.ID = @ID            
       END
       ELSE
    
       BEGIN
           SET @Exists = 1
           SELECT TOP 0 NULL
       END
    END
    

    【讨论】:

    • 这个解决方案喜欢我。正如我对 Gordon Linoff 所说,该解决方案通过首先检查是否存在来避免 sql server 引擎执行不必要的选择。
    【解决方案3】:

    您得到的第二个结果来自语句 select top 0 null

    【讨论】:

    • 你说的不对。第二个结果: SELECT TOP 0 NULL 仅在 SELECT TOP 1 返回行并且在我的情况下 SELECT TOP 1 不返回任何行时才执行,因此第一个结果 SELECT b.* FROM AnotherTable b ... 被执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2017-04-23
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2023-03-24
    相关资源
    最近更新 更多