在SQL Server中将一个存储过程调用为另一个存储过程。是否获取错误?
我想通过将相同的参数D1和DIV传递给两个过程,从第一个过程SP_报告调用第二个过程SP_集合 R_SP_报告:第一个程序在SQL Server中将一个存储过程调用为另一个存储过程。是否获取错误?,sql,sql-server,database,sql-server-2008,sql-server-2017,Sql,Sql Server,Database,Sql Server 2008,Sql Server 2017,我想通过将相同的参数D1和DIV传递给两个过程,从第一个过程SP_报告调用第二个过程SP_集合 R_SP_报告:第一个程序 CREATE PROC R_SP_REPORT @D1 DATETIME, @DIV VARCHAR(10) AS BEGIN SELECT A.TRNDATE, A.DIVISION, A.USER, ... etc... FROM REPORT A INNER JOIN
CREATE PROC R_SP_REPORT
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
A.TRNDATE, A.DIVISION, A.USER,
... etc...
FROM
REPORT A
INNER JOIN
REPORT_MAIN B ON A.ID = B.ID
AND A.DIVISION = B.DIV
WHERE
LEFT(A.ID, 2) IN ('SI')
AND a.TRNDATE = @d1
AND a.DIVISION = @div
GROUP BY
TRNDATE, DIVISION, USER
--I want to call here R_SP_COLLECTION stored procedure
BEGIN
EXEC R_SP_COLLECTION @d1 = @d1, @div = @div // Do something here.. I am not gatting data from
//second stored procedure..
END
END
CREATE PROCEDURE R_SP_COLLECTION
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
PostDateTime, DIVISION, NAME
FROM
SalesEntry
WHERE
PostDateTime = @d1
AND DIVISION = @div
END
R_SP_收集:第二个过程
CREATE PROC R_SP_REPORT
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
A.TRNDATE, A.DIVISION, A.USER,
... etc...
FROM
REPORT A
INNER JOIN
REPORT_MAIN B ON A.ID = B.ID
AND A.DIVISION = B.DIV
WHERE
LEFT(A.ID, 2) IN ('SI')
AND a.TRNDATE = @d1
AND a.DIVISION = @div
GROUP BY
TRNDATE, DIVISION, USER
--I want to call here R_SP_COLLECTION stored procedure
BEGIN
EXEC R_SP_COLLECTION @d1 = @d1, @div = @div // Do something here.. I am not gatting data from
//second stored procedure..
END
END
CREATE PROCEDURE R_SP_COLLECTION
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
PostDateTime, DIVISION, NAME
FROM
SalesEntry
WHERE
PostDateTime = @d1
AND DIVISION = @div
END
我正在传递第一个过程R_SP_报告中的@D1和@Div参数,我想将它们分别发送到R_SP_集合的PostDateTime和Division
那我该怎么做呢?需要帮助吗
更新:发生此错误后,我尝试转换datetime,如查询中所示,但仍然收到相同的错误:
CREATE PROC R_SP_COLLECTION
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
CONVERT(DATETIME, PostDateTime, 105) AS TDATE,
DIVISION, NAME
FROM
SalesEntry
WHERE
PostDateTime = @d1 AND DIVISION = @div
END
执行第一个过程时出错
CREATE PROC R_SP_REPORT
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
A.TRNDATE, A.DIVISION, A.USER,
... etc...
FROM
REPORT A
INNER JOIN
REPORT_MAIN B ON A.ID = B.ID
AND A.DIVISION = B.DIV
WHERE
LEFT(A.ID, 2) IN ('SI')
AND a.TRNDATE = @d1
AND a.DIVISION = @div
GROUP BY
TRNDATE, DIVISION, USER
--I want to call here R_SP_COLLECTION stored procedure
BEGIN
EXEC R_SP_COLLECTION @d1 = @d1, @div = @div // Do something here.. I am not gatting data from
//second stored procedure..
END
END
CREATE PROCEDURE R_SP_COLLECTION
@D1 DATETIME,
@DIV VARCHAR(10)
AS
BEGIN
SELECT
PostDateTime, DIVISION, NAME
FROM
SalesEntry
WHERE
PostDateTime = @d1
AND DIVISION = @div
END
警告:通过聚合或其他集合操作消除空值
Msg 8114,16级,状态5,程序R_SP_采集,第0行
将数据类型nvarchar转换为datetime时出错
对于sql server,请尝试:
EXEC R_SP_COLLECTION@D1、@DIVSP_前缀由Microsoft保留,不应用于用户过程。这样做会带来性能成本和程序在更新后一天无法运行的风险。另外,为什么要标记SQL Server 2008和2017?这两个版本有很大的不同,因为两个版本之间有9年的时间间隔,而前者在去年就结束了。对于伪SQL来说,它看起来不错,这表明我们可能遗漏了一些东西。然而,另一个注意事项是,报表中没有一个a,所以为什么要将其别名为a?正如@Larnu所说,它看起来不错。我做了一个精简版本的这些运行和他们的工作。因此,我建议去一些人会考虑老学校。在不同点使用PRINT@d1等,查看两个过程中@d1和@div的实际内容。此外,还应张贴路标,例如打印即将呼叫第二个SP,告知正在运行哪个部件。如果这没有帮助,请计算出正在运行的确切SQL,并手动运行它,以确保它提供了您所期望的结果。与LIKE一起使用时,%符号具有特殊意义。在这种情况下,这并不意味着选择所有内容。奇怪的是,你在问题中添加了关于sp_u前缀的注释,添加了R_u作为另一个前缀,但忽略了与我们即将回答问题相关的部分。