sql-server - 为什么我的 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。
解决方案
我猜你的存储过程是这样的:
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()
和相关类型。默认长度因上下文而异,并且通常会引入难以调试的错误。
推荐阅读
- vba - 找到带有特殊标签的下一个形状
- database - 有什么办法可以根据 CPU 的利用率产生新的 Spanner 节点?
- ios - Firebase iOS Swift:无法将 FIRTimestamp 类型的对象存储在
- angular - 表单字段样式在 Angular 9 中不起作用?
- google-apps-script - var userMail = e.user.getEmail(); 在编辑谷歌表格时不拉电子邮件
- html - 如何通过 HTML 更改 MIME 类型?
- javascript - 在 JavaScript 中使用正则表达式删除元字符周围的空格
- javascript - 如何在锚点悬停的左下角显示与所述锚点的 href 属性不同的链接?
- android - 如何检查 firebase-auth 用户声明?
- javascript - CSS / JS 无法处理通过 AJAX 获取的内容