SQL 在 SP 中选择 maxDate

标签 sql sql-server sql-server-2008

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 与数据库中列的最新可用日期而不是今天的日期进行比较。 您看到的代码工作正常,但是当我选择比数据库中最后一个现有日期晚的日期时,查询会运行一段时间,然后返回未找到列的错误。

预先感谢您的任何建议。

帮助。 以下部分代码不起作用,但我不明白为什么。有没有人有什么建议?谢谢

     -- 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

最佳答案

那么,您可以用子查询替换它:

(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) 上添加索引。

关于SQL 在 SP 中选择 maxDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875854/

相关文章:

sql - 有没有办法在不卸载的情况下完全重置 SQL Server 实例?

sql-server - 如何在 T-SQL 中重写电话号码?

sql - 使用内连接两次

sql - 如何从数据库中选择一条记录并在原子查询中对其进行更新

php - 尝试将日期插入日期时间列时出错

sql - 使用单个更新命令更新或创建嵌套的 jsonb 值

java - 使用内部联接获取一个月的所有周数据

sql - 使用 group by 和多个列的行号

sql - 选择并为 2 列上具有相同值的唯一 ID 创建新 ID

sql-server-2008 - SQL Server 兼容级别含义