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内の列で使用可能な最新の日付と比較されます。表示されるコードは正常に機能しますが、DB内の最後の既存の日付よりも後の日付を選択すると、列が見つからないというエラーが返される前に、クエリがしばらく実行されます。

提案を事前に感謝します。

ヘルプ。コードの次の部分は機能しませんが、理由がわかりません。誰か提案はありますか?ありがとうございました

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


SET@MaxTimeStamp =
'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
4

2 に答える 2

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)

于 2013-02-14T13:30:28.930 に答える
1

これを試して...

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

IF @StartDate <= @maxDate
BEGIN
  --Your original query here
END
于 2013-02-14T13:34:00.950 に答える