首页 > 解决方案 > 为什么我的 T-SQL 存储过程没有执行?

问题描述

我的表结构如下:

GLPERIOD

 periodid     char
 strtdate     datetime
 closdate     datetime
 fiscalyr     char

全球邮政

 postdate     datetime
 account      char
 amount       money

考虑到这一点,以下存储过程(其参数定义为与表列所需的类型相同)在调用时不返回任何内容。

PROCEDURE MonthlyActual 
    @P2 CHAR, @P3 CHAR, @P4 CHAR
    SELECT SUM(amount) 
    FROM GLPOST 
    WHERE account = @P2
      AND postdate BETWEEN (SELECT strtdate 
                            FROM GLPERIOD 
                            WHERE periodid = @P3 AND fiscalyr = @P4) AND 
                           (SELECT closedate 
                            FROM GLPERIOD 
                            WHERE periodid = @P3 AND fiscalyr = @P4)
    GROUP BY   
        account

我试着这样称呼它:

MonthlyActual @P2 = '51080-000', @P3 = 1, @P4 = 2018

MonthlyActual @P2 = '51080-000', @P3 = '1', @P4 = '2018'

……什么也得不到。然而,如果我对这些值进行硬编码,代码就会完美运行。我究竟做错了什么?

我在 Windows Server 上使用 SQL Server Management Studio。

标签: sql-servertsqlstored-procedures

解决方案


我猜你的存储过程是这样的:

create stored procedure MonthlyActual (
    @p2 char,
    @p3 char,
    @p4 char
)

如果是这样,问题就很简单了。声明是针对单个字符的。将它们更改为更合理的类型:

create stored procedure MonthlyActual (
    @account varchar(255),
    @periodid varchar(255),
    @year varchar(255)
)

我还建议重命名参数,以便代码更有意义。

道德?在 SQL Server中,始终使用长度char()和相关类型。默认长度因上下文而异,并且通常会引入难以调试的错误。


推荐阅读