【问题标题】:Pass a DataTime parameter to stored procedure and check a condition将 DateTime 参数传递给存储过程并检查条件
【发布时间】:2013-06-07 01:12:21
【问题描述】:

假设:

我需要从“PrivateDB”数据库同步“PublicDB”。其中两个参数应传递给存储过程,服务器名称和日期时间类型参数。

HistoryDate 不是主键,而是用于更新。

场景:

如果今天是 8 日,并且用户没有从 dateTimePicker -UI 中选择任何上一个日期,则此存储过程只会在 8 日更新记录。

如果今天是 8 日并且用户在我的 SP 中选择 5th of month= targetdate,它应该从 4th 删除“PublicDB”表,然后再次插入 5th、6​​th 和 8th。

问题: 服务器参数工作正常,但对于数据时间参数:

如果 Sp 在 sql server 中执行得到这个错误: 从字符串转换日期和/或时间时转换失败。

如果添加到表适配器它得到这个错误: 生成的 SELECT 语句 从字符串转换日期/时间时对话失败。 *要将这些设置应用于您的查询,请单击完成*

这里是 sp:

CREATE PROCEDURE [dbo].[spname] @Server SYSNAME,

@TDate NVARCHAR(50) --have tested: DateTime

AS
BEGIN

    DECLARE @SQL1 NVARCHAR(2000);
    DECLARE @SQL2 NVARCHAR(2000);
    DECLARE @LastRecordDate DATETIME;
    DECLARE @Count INT;
    DECLARE @TargetDate DATETIME;

    SET @TargetDate = CONVERT(DATETIME, @TDate, 121);

    SET @Count = CONVERT(INT, 'SELECT COUNT(*) FROM   [' + @Server + '].[PublicDB].[dbo].[TableName]

        WHERE HistoryDate >= [' + @TargetDate + '] ');

    EXECUTE sp_executesql @Count;

    IF @Count > 0 BEGIN

        SET @SQL1 = 'DELETE FROM [' + @Server + '].[PublicDB].[dbo].[TableName] 

WHERE HistoryDate >= [' + @TargetDate + '] 

  INSERT INTO [PublicDB].[dbo].[TableName]
    SELECT  TOP 5
       [HistoryDate]
      ,[columnName1]
      ,[columnName2]
      ,[columnName3]
      ,[columnName4]
      ,[columnName5]
      ,[columnName6]
      FROM PrivateDB.dbo.TableName
      WHERE HistoryDate >= [' + @TargetDate + '] 
  ';

        EXECUTE sp_executesql @SQL1;

    END

    ELSE BEGIN

        SET @LastRecordDate = CONVERT(DATETIME, 'SELECT TOP 1 HistoryDate FROM [PublicDB].[dbo].[TableName] ORDER BY HistoryDate DESC', 121);

        -- has tested: cast('SELECT TOP 1 HistoryDate FROM [Public].[dbo].[TableName] ORDER BY HistoryDate DESC' as datetime)

        EXECUTE sp_executesql @LastRecordDate;

        SET @SQL2 = '

    INSERT INTO [' + @Server + '].[PublicDB].[dbo].[TableName]
      SELECT  TOP 5 
       [HistoryDate]
      ,[columnName1]
      ,[columnName2]
      ,[columnName3]
      ,[columnName4]
      ,[columnName5]
      ,[columnName6]
      FROM PrivateDB.dbo.TableName
      WHERE HistoryDate > [' + @LastRecordDate + ']

  ';

        EXECUTE sp_executesql @SQL2;

    END


END

【问题讨论】:

    标签: sql-server stored-procedures parameter-passing


    【解决方案1】:

    我认为这些行可能是问题

    SET @Count = CONVERT(INT, 'SELECT COUNT(*) FROM   [' + @Server + '].[PublicDB].[dbo].[TableName]
                 WHERE HistoryDate >= [' + @TargetDate + '] ');
    

    您要求将字符串/日期时间转换为 int

    我猜您正试图从 select 语句中获取计数,一种方法类似于以下内容(未经测试!)

    CREATE TABLE #t_count(no int) 
    DECLARE @sqlcount varchar(1000)
    DECLARE @count int
    SET @sqlcount = 'INSERT into #t_count SELECT COUNT(*) 
                FROM   [' + @Server + '].[PublicDB].[dbo].[TableName]
                WHERE HistoryDate >=''' + convert(varchar(30),@TargetDate,120) + ''''
    EXEC( @sqlcount )
    SELECT @count = no FROM #t_count
    

    示例sqlfiddle

    编辑

    我看到你更新了你的答案http://sqlfiddle.com/#!2/d41d8/14528

    但是如果您阅读上面的答案,您会看到它

    创建一个临时表

    CREATE TABLE #t_count(no int) 
    

    构建一个 sql 字符串以将计数插入到临时表中

    SET @sqlcount = 'INSERT into #t_count SELECT COUNT(*) 
                    FROM   [' + @Server + '].[PublicDB].[dbo].[TableName]
                    WHERE HistoryDate >=''' + convert(varchar(30),@TargetDate,120) + ''''
    EXEC( @sqlcount )
    

    从表中获取计数值

    SELECT @count = no FROM #t_count
    

    您的编辑没有这样做!

    此外,由于某种原因,您在 [] 中包含文字值,这些需要删除

    不错

    where historydate = '2012-12-12 12:12'
    

    不好的

    where historydate = [2012-12-12 12:12]
    

    【讨论】:

    • ps。 Historydate 列格式如下:2008-09-25 00:00:00.000
    • 我需要计算第 7 天之后是否有任何新的记录插入。如果是,我应该在第 8 天将记录从 PrivateDB 插入到 PublicDB
    • 我无权将任何列或表添加到 PublicDB 或 PrivateDB。我试图从这个@count 中得到什么:假设 publicdb 已在 5 日更新,但用户犯了错误并在 2 日纠正了某事。因此,我需要从 2 号开始删除所有记录,然后再次插入 2 号、3 号、4 号和 5 号。
    • 我也无权在 PrivateDB 上添加一个 Flag, Modifieddate 列。这很有趣,但这正是他们想要的。
    • 我已经更新了我犯了几个错误的答案! - 并提供了一个 sqlfiddle sn-p,它应该演示一种获取计数的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2018-04-04
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多