2013-02-14 34 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