2013-02-14 30 views
2
USE [MyDatabase] 
GO 
Object: StoredProcedure [dbo].[SP_MyProcedure]  
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


CREATE PROCEDURE [dbo].[SP_MyProcedure] 
-- Add the parameters for the stored procedure here 
@StartDate NVARCHAR(19), 
@EndDate NVARCHAR(19) 
AS 
BEGIN 

SET NOCOUNT ON; 

Insert statements for procedure here 
DECLARE @FirstQuery nvarchar(1500); 
DECLARE @SecondQuery nvarchar(1500); 
DECLARE @TSQL nvarchar(4000); 



SET @FirstQuery = 
    ' 
    SELECT * FROM OPENQUERY(LinkedServer, 
    '' 
    SELECT * FROM Server.Table 
    WHERE Name IN 
    (SELECT Tagname COLLATE DATABASE_DEFAULT FROM LocalServer.MyServer.dbo."NameList" 
    WHERE LOCATION = ''''X'''' AND SOURCE = ''''Y'''') AND TIMESTAMP >= ''''' + @StartDate + ''''' AND TIMESTAMP < ''''' + @EndDate + ''''''')'; 

我的問題是:如何在代碼中包含max(date),因此@startDate將與DB中列的最近可用日期進行比較而不是今天的日期。 您看到的代碼工作正常,但是,當我選擇比數據庫中最後一個現有日期更晚的日期時,查詢運行一段時間,然後它返回未找到任何列的錯誤。SQL選擇SP中的maxDate

在此先感謝您的任何建議。

幫助。 下面的代碼部分不起作用,但我不明白爲什麼。有沒有人有什麼建議?謝謝

 -- Insert statements for procedure here 
DECLARE @FirstQuery nvarchar(1500); 
DECLARE @SecondQuery nvarchar(1500); 
DECLARE @TSQL nvarchar(4000); 
DECLARE @MaxTimeStamp nvarchar(19); 


[email protected] = 
'SELECT MAX(TimeStamp) From OPENQUERY(LinkedServer)' 


IF @StartDate <= @MaxTimeStamp 
BEGIN 

SET @FirstQuery = 
    ' 
    SELECT * FROM OPENQUERY(LinkedServer, 
    '' 
    SELECT * FROM Server.Table 
    WHERE Name IN 
    (SELECT Tagname COLLATE DATABASE_DEFAULT FROM LocalServer.MyServer.dbo."NameList" 
    WHERE LOCATION = ''''X'''' AND SOURCE = ''''Y'''') AND TIMESTAMP >= ''''' + @StartDate + ''''' AND TIMESTAMP < ''''' + @EndDate + ''''''')'; 

END 
+1

爲什麼有這麼多'「單曲? – Dukeling 2013-02-14 13:27:28

回答

2

嗯,你可以使用子查詢代替它:

(select max(timestamp) from NameList) 

如果這是一個存儲過程,你可能希望把這個變量,像這樣:

declare @MaxTimestamp datetime; 
select @MaxTimestamp = max(TimeStamp) from NameList 

-- in your query, something like 
     coalesce(@StartTime, maxTimeStamp) 

如果性能問題,請嘗試在NameList(Location, Source, Timestamp)上添加索引。

+0

在我看來,使用'coalesce'可以返回與請求不同的記錄。我認爲最好不要再返回任何列,更快。 – 2013-02-14 13:43:29

+0

不要緊......這實際上是OP要求的。我讀錯了。 : - \ – 2013-02-14 13:49:37

+0

我試了兩個代碼,你可以傑夫請張貼你之前發佈的?我需要一些時間來嘗試一下。但是,似乎我有類型定義的一些問題 – Farkiba 2013-02-14 13:53:41

1

嘗試......

DECLARE @maxDate datetime; 
SELECT @maxDate = MAX(timestamp) FROM OPENQUERY(...); 

IF @StartDate <= @maxDate 
BEGIN 
    --Your original query here 
END 
+0

謝謝,這需要我一些時間來嘗試,但我肯定會回來,不管它是否有用。再次感謝你 – Farkiba 2013-02-14 14:22:14