2017-03-01 5 views
1

Ich hoffe, jemand kann helfen. Ich bin noch ziemlich neu in SQL/Programmierung, also könnte dies eine leicht zu beantwortende Frage sein.Deklarieren von Variablen in SQL

Für das folgende Skript erhalte ich einen Fehler, wo es beschwert, dass die 3 Variablen @startdate, @enddate und @ result1rowcount nicht deklariert wurden. Ich weiß, ich könnte die Deklaration von denen weiter nach unten verschieben und es würde funktionieren. Aber ich möchte die Theorie verstehen, warum es nicht wie unten erklärt werden kann, da ich die Variablen gleich am Anfang deklariert habe. Diese Erklärungen müssen irgendwann verloren gehen. Ich bin mir nicht sicher wann? Wenn jemand erklären könnte, warum es den Fehler zurückgibt, wäre das großartig. Ich möchte keine Vorschläge, wie man es als solches neu schreibt.

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]', 
       @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

Vielen Dank. Macht jetzt vollkommen Sinn. –

+0

"GO" ist kein SQL-Befehl. Es ist ein Befehl an den Prozessor (in den meisten Fällen SQL Server Management Studio, aber auch Dienstprogramme wie OSQL.exe und ISQL.exe), um lange Skripts in "Batches" zu trennen. SQL Server selbst wird niemals einen 'GO'-Befehl sehen und würde nicht wissen, was damit zu tun wäre. :-) – pmbAustin

Antwort

4

Das Problem ist wegen Ihrer GO Anweisung direkt vor ihm.

Diese trennt es in verschiedenen Chargen und deklarierten Variablen außerhalb der Charge außerhalb des Bereichs sind sie in deklariert wurden.

Um das Problem zu beheben, einfach die GO entfernen.

+0

oder GO zum Ende bewegen – whereisSQL

+1

@whereeisSQL Wahr, aber das ist im Grunde sinnlos. – Siyual

Verwandte Themen