簡體   English   中英

存儲過程日期時間無效列名

[英]Stored procedure datetime invalid column name

我試圖讓日期時間查詢在存儲過程中工作,但我嘗試的一切都不起作用。

要么我得到錯誤,要么得到我不期望的結果,就像沒有考慮查詢語句一樣。

這是我試圖查詢的數據庫列中的值格式:

2019-10-22 02:09:04.953

如果我在 SQL Server 中打開一個新查詢,並手動編寫查詢它工作正常,並且我在給定日期之后得到結果:

SELECT TOP 100 *
FROM [Test].[dbo].[Order]
WHERE [CreatedOnUtc] > '10/15/2019 13:30:00.000'
ORDER BY [CreatedOnUtc] 

CreatedOnUtc的數據類型是datetime

在我的代碼中,我嘗試了很多事情,比如添加文化信息,使用字符串進行格式化,以及將日期時間傳遞給數據庫而不是字符串:

var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd HH:mm:ss.fff");
var createFromDate = createdFromUtc.Value.ToString("yyyy/MM/dd HH:mm:ss.fff");
var createFromDate = createdFromUtc.Value.ToString("yyyy-MM-dd");
var createFromDate = createdFromUtc.Value.ToString("yyyy/MM/dd");

這是我的存儲過程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
    @CreatedFromUtc NVARCHAR(MAX) = NULL,
    @CreatedToUtc NVARCHAR(MAX) = NULL
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX)

    SET NOCOUNT ON;

    SET @sql = 'SELECT TOP 100 *
                FROM [Test].[dbo].[Order] o WIT H(NOLOCK) '

    SET @sql = @sql + 'WHERE o.Deleted = 0'

    BEGIN
        SET @sql = @sql + '
        AND o.CreatedOnUtc BETWEEN "' +  CAST(@CreatedFromUtc AS nvarchar(max)) + '" AND "' +  CAST(@CreatedToUtc AS nvarchar(max)) + '"' -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 126 ) --  --  -- + CAST(@CreatedFromUtc AS datetime) -- + CAST(@CreatedFromUtc AS nvarchar(max)) -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 101 )  -- + CAST(@CreatedFromUtc AS nvarchar(max))  -- 
    END

    EXEC sp_executesql @sql
END

我在存儲過程中留下了一些注釋掉的代碼,所以你可以看到我嘗試了其他的東西。 真的不知道我哪里出錯了。

更新
我更改了我的存儲過程以使用日期時間,並像這樣更新了我的代碼,但它仍然不起作用。

    @CreatedFromUtc DATETIME = NULL    // new parameter declaration
BEGIN
    SET @sql = @sql + '
        AND o.CreatedOnUtc > ' +  Convert(datetime, @CreatedFromUtc, 101 ) + '' -- AND "' +  CAST(@CreatedToUtc AS nvarchar(max)) + '"' -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 126 ) --  --  -- + CAST(@CreatedFromUtc AS datetime) -- + CAST(@CreatedFromUtc AS nvarchar(max)) -- + CAST(@CreatedFromUtc AS datetime) -- + Convert(datetime, @CreatedFromUtc, 101 )  -- + CAST(@CreatedFromUtc AS nvarchar(max))  -- 
    END

同樣在查詢中,我嘗試使用CAST(@CreatedFromUtc AS datetime)但它仍然不起作用。

在我的 C# 代碼中,我可以確認 var 是datetime

現在我在堆棧跟蹤中收到此錯誤

從字符串轉換日期和/或時間時轉換失敗

在此處輸入圖片說明

  1. 使用正確的datetype即datedatetime2datetime2建議在datetime
  2. 除非絕對必要,否則不要使用動態 SQL,根據所提供的信息,這里並非如此。

重新編寫您的程序給出:

    ALTER PROCEDURE [dbo].[OrderLoadAllPaged]
    (
      -- check that the precision matches your needs
      @CreatedFromUtc datetime2(0)
      , @CreatedToUtc datetime2(0)
    )
    AS
    BEGIN
      SET NOCOUNT ON;

      SELECT TOP 100 *
      FROM [Test].[dbo].[Order]
      -- Check the >=, < logic is correct for your purposes
      WHERE [CreatedOnUtc] >= @CreatedFromUtc
      AND [CreatedOnUtc] < @CreatedToUtc
      ORDER BY [CreatedOnUtc];

      RETURN 0;
    END

    exec [dbo].[OrderLoadAllPaged] '2019-10-15 13:30:00.000', '2019-10-16 13:30:00.000'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM