2017-03-01 10 views
1

誰かを助けることができます。私はまだかなり新しいSQL /プログラミングですので、これは疑問に答えるのは簡単かもしれません。SQLで変数を宣言する

以下のスクリプトでは、@startdate、@enddate、および@ result1rowcountという3つの変数が宣言されていないというエラーが表示されます。私はそれらの宣言をさらに下に動かすことができ、それはうまくいくことを知っています。しかし、私は、なぜ私はすでに開始時に変数を宣言しているので、以下のようにできないのかという理論を理解したい。それらの宣言はある時点で失われなければならない。いつ私には分かりませんか?誰かがなぜエラーを返すのかを説明することができれば、それは素晴らしいだろう。私はそのように書き直す方法についての提案は望まない。

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

ありがとうございました。今、完璧な意味合いがあります。 –

+0

"GO"はSQLコマンドではありません。これはプロセッサ(ほとんどの場合、SQL Server Management Studioだけでなく、OSQL.exeやISQL.exeなどのユーティリティ)へのコマンドで、長いスクリプトを「バッチ」に分けます。 SQL Server自体には「GO」コマンドが表示されず、実行された場合に何を処理するのかわかりません。 :-) – pmbAustin

答えて

4

問題は、右のそれの前にあなたのGOの文です。

これは、異なるバッチに分離し、変数はそれらがで宣言されたバッチの外の範囲外であると宣言した。

問題を解決するには、単にGOを削除します。

+0

または最後にGO – whereisSQL

+1

@whereisSQL真実ですが、それは本質的に無意味です。 – Siyual