早上好,
我遇到了将工作查询集成到存储过程中的麻烦 我的主要问题是,我正在使用带有整数的WHILE循环,并且存储过程遇到了麻烦。
我的工作查询/代码如下:
CREATE TABLE #tempScaffStandingByTime
(
TotalStanding INT,
MonthsAgo INTEGER
)
DECLARE @StartDate DATETIME = null
DECLARE @months INTEGER = 12
use [Safetrak-BradyTechUK]
WHILE @months >= 0
BEGIN
SET @StartDate = DATEADD(mm, -12 + @months, DATEADD(mm, 0, DATEADD(mm,
DATEDIFF(mm,0,GETDATE()-1), 1)))
INSERT INTO #tempScaffStandingByTime
select TOP 1 COUNT(*) OVER () AS TotalRecords, @months
from asset a
join wshhistory h on h.assetid = a.uid
where a.deleted = 0 and h.assetstate <> 6
AND (dbo.getdecommissiondate(a.uid) > @StartDate)
group by a.uid
SET @months -= 3
END
SELECT * FROM #tempScaffStandingByTime
DROP TABLE #tempScaffStandingByTime
这会产生我想要的输入:
然后我尝试将此代码导入我的存储过程
DECLARE @Query varchar (8000)
, @Account varchar (100) = 'BradyTechUK'
SET @Account = 'USE [Safetrak-' + @Account + ']'
/************************************************************************************/
/********** Create Table to hold data ***********************************************/
CREATE TABLE #tempScaffStandingByTime
(
TotalStanding INT,
MonthsAgo INTEGER
)
/************************************************************************************/
/********** Populate temp table with data *******************************************/
DECLARE @StartDate DATETIME = null
DECLARE @months INTEGER = 12
SET @Query= +@Account+ '
WHILE '+@months+' >= 0
BEGIN
SET '+@StartDate+' = DATEADD(mm, -12 + ('+@months+', DATEADD(mm, 0, DATEADD(mm, DATEDIFF(mm,0,GETDATE()-1), 1)))
INSERT INTO #tempScaffStandingByTime
select TOP 1 COUNT(*) OVER () AS TotalRecords, '+@months+'
from asset a
join wshhistory h on h.assetid = a.uid
where a.deleted = 0 and h.assetstate <> 6
AND (dbo.getdecommissiondate(a.uid) > '+@StartDate+')
group by a.uid
SET '+@months+' -= 3
END'
EXEC (@Query)
/************************************************************************************/
/********** Select Statement to return data to sp ***********************************/
Select TotalStanding
, MonthsAgo
FROM #tempScaffStandingByTime
/************************************************************************************/
DROP TABLE #tempScaffStandingByTime
但是当在SSRS中加载存储过程时,我收到转换错误 我可以将我的参数转换为字符串,但之后它将不再计算。
我在互联网上进行了广泛的搜索,尝试了各种各样的事情,但无法让它发挥作用。
感谢任何帮助,谢谢!
答案 0 :(得分:2)
原来的问题似乎来自@months
中的INT与@Accounts
和@Query.
中的VARCHAR之间缺少转换。
您需要将月份转换为字符串以附加它,否则SQL Server会认为您正在尝试添加。
但是,当您尝试通过动态SQL设置它时,您的@StartDate
变量的使用也会出现问题,而这种动态SQL不会像那样工作 - 和@months
一样它会有不正确的数据类型,但我也不确定为什么它按原样编写,以及你要用它实现的目标
我认为 - 根据您的撰写内容 - 这可能是您正在寻找的内容?
SET @Query= @Account + '
DECLARE @StartDate DATETIME = null
DECLARE @months VARCHAR(2) = ''12''
WHILE @months >= 0
BEGIN
SET @StartDate = DATEADD(mm, -12 + @months, DATEADD(mm, 0, DATEADD(mm, DATEDIFF(mm,0,GETDATE()-1), 1)))
INSERT INTO #tempScaffStandingByTime
select TOP 1 COUNT(*) OVER () AS TotalRecords, @months, @StartDate
from asset a
join wshhistory h on h.assetid = a.uid
where a.deleted = 0 and h.assetstate <> 6
AND (dbo.getdecommissiondate(a.uid) > @StartDate)
group by a.uid
SET @months -= 3
END'
EXEC (@Query)