Emr*_*ies 2 stored-procedures sql-server-2008-r2
如果我在存储过程之外运行查询,我会得到结果,但我只会在执行查询后得到列名作为结果 - 即使返回值为 0。任何帮助将不胜感激。
ALTER PROCEDURE [dbo].[Reconciliation2]
(
@Param1 int,
@Param2 int,
@Param3 varchar,
@Param4 varchar
)
AS
BEGIN
SET NOCOUNT ON;
SELECT
T.FY AS [FY],
T.FY_PERIOD AS [Period],
CONVERT(DATE, CREATED_DATE) AS [Created Date],
CONVERT(DATE, TRANS_DATE) AS [Trans Date],
T.TRAN_DOC_TYPE AS [Doc Type],
TASK_ID AS [Task],
T.DOC_NO AS [Doc Number],
LINE_NO AS [Line],
SEQNO AS [Seq],
LINE_DESCRIPTION AS [Description],
SUBSTRING(ACCT_NO,1,2) + '-' +
SUBSTRING(ACCT_NO,3,5) + '-' +
SUBSTRING(ACCT_NO,8,5) + '-' +
SUBSTRING(ACCT_NO,13,6) + '-' +
SUBSTRING(ACCT_NO,19,4) + '-' +
SUBSTRING(ACCT_NO,23,4) AS [Account Number],
DEBIT,
CREDIT
FROM
DBVW_FIN_TRANSACTIONS_UDR T
INNER JOIN
(SELECT
INST_ID, FY,
TRAN_DOC_TYPE, DOC_NO
FROM
DBVW_FIN_TRANSACTIONS_UDR
WHERE
INST_ID = 'SC00'
AND FY = @Param1
AND FY_PERIOD = @Param2
AND ([ACTION] = '' OR [ACTION] = 'V')
AND SYS_GEN_DETAIL_LINE = 0
AND TRAN_DOC_TYPE = @Param3
AND TASK_ID = @Param4
GROUP BY
INST_ID, FY, TRAN_DOC_TYPE, DOC_NO) TRAN_BASE ON TRAN_BASE.INST_ID = T.INST_ID AND
TRAN_BASE.FY = T.FY AND
TRAN_BASE.TRAN_DOC_TYPE = T.TRAN_DOC_TYPE AND
TRAN_BASE.DOC_NO = T.DOC_NO
WHERE
T.INST_ID = 'SC00' AND
T.FY = @Param1 AND
T.SYS_GEN_DETAIL_LINE = 0 AND
T.TRAN_DOC_TYPE = @Param3 AND
TASK_ID = @Param4
ORDER BY
T.DOC_NO, T.LINE_NO, T.SEQNO
END
Run Code Online (Sandbox Code Playgroud)
停止使用诸如varchar不指定长度之类的东西。看看这里发生了什么:
CREATE PROCEDURE [dbo].[Reconciliation_broken]
@Param1 varchar
AS
BEGIN
SET NOCOUNT ON;
PRINT @Param1;
END
GO
EXEC dbo.Reconciliation_broken @Param1 = 'what happened?';
Run Code Online (Sandbox Code Playgroud)
结果:
w
Run Code Online (Sandbox Code Playgroud)
当你不指定长度时,你会得到无声截断——在某些情况下它是 30 个字符;在这种情况下,它是 1 个字符。没有错误消息或警告——事实上,如果你在这里插入数据,你将插入 1 个字符,谁知道在你意识到之前你会这样做多久。这些数据将丢失,没有恢复的希望。
因此,更改这些参数以匹配基础列的数据类型和长度。有关更多信息,请参阅: