2017-03-01 125 views
1

希望有人能帮忙。我对SQL /编程还很陌生,所以这可能是一个很容易回答的问题。在SQL中声明变量

对于下面的脚本,我收到一个错误,它抱怨3个变量@startdate,@ enddate和@ result1rowcount没有被声明。我知道我可以将这些声明进一步向下移动,它会起作用。但我想理解这个理论为什么不能如下所述,因为我已经在一开始就宣布了这些变量。这些声明必须在某个时候丢失。我不确定何时?如果有人能够解释为什么它会返回错误,那会很好。我不想就如何重写它提出建议。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Declare @count int 
Declare @r int 
Declare @start datetime 
Declare @end datetime 
Declare @startdate datetime 
Declare @enddate datetime 
Declare @Result1RowCount int 

Set @start = DATEADD(d,0,DATEDIFF(d,0,getdate()-1)) 
set @end = DATEADD(d,0,DATEDIFF(d,0,getdate())) 

Create table #tempwill 
(feed int, 
returnid int, 
ProcessStartTime datetime, 
ProcessEndTime datetime, 
importcount int, 
Selectedstartdate datetime, 
Selectedenddate datetime) 

Insert into #tempwill 
Select feed, returnid, processstarttime, processendtime, importcount, selectedstartdate, selectedenddate 
from Will_Database.dbo.Import 
where selectedstartdate = @start 
and selectedenddate = @end 

SET @COUNT = (select count(*) from #tempwill where importcount ='0') 

IF @Count > 0 
    Begin 
      exec @r = Bill_Database.dbo.op_Mail_2005 @profile_name = 'Testserver', 
       @MailTo = '[email protected]l.com', 
       @MailBCC = '', 
       @importance = 'HIGH', 
       @subject = 'Warning - Numbers are not as expected', 
       @body = 'Please investigate as todays numbers are not what we expected ' 

     End 


GO 

**Set @startdate = DATEADD(d,0,DATEDIFF(d,0,getdate()-2)) 
set @enddate = DATEADD(d,0,DATEDIFF(d,0,getdate()-1))** 

CREATE TABLE #Results1 (ID int, Ref int, Code int, Explanation varchar(200), Timeof datetime) 

INSERT #Results1 (ID, Ref, Code, Explanation, Timeof) 
SELECT A.ID, B.Ref, A.Code, A.Explanation, A.Timeof 
FROM Testserver.Will_database.dbo.codetime A 
INNER JOIN Testserver.Bill_database.dbo.Coderegister B ON A.Code= B.Code AND A.Ref = B.Ref 
WHERE A.Timeof >= @StartDate 
AND A.Timeof < @EndDate 

**SELECT @Result1RowCount = @@RowCount** 

**insert into Daily_Check values 
(1, 1, @Result1RowCount, @startdate, @enddate)** 
+0

非常感谢。现在完美。 –

+0

“GO”不是SQL命令。这是对处理器(大多数情况下是SQL Server Management Studio,但也包括OSQL.exe和ISQL.exe等实用程序)的命令,用于将长脚本分隔为“批处理”。 SQL Server本身永远不会看到一个'GO'命令,如果它发生了,它不知道该怎么做。 :-) – pmbAustin

回答

4

问题是因为您的GO声明就在它之前。

这分离成不同的批次,并声明的变量超出范围他们被宣布批次之外。

要解决此问题,只需删除GO

+0

或者转到最后 – whereisSQL

+1

@whereisSQL没错,但是这实际上毫无意义。 – Siyual