[英]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
。
現在我在堆棧跟蹤中收到此錯誤
從字符串轉換日期和/或時間時轉換失敗
date
或datetime2
( datetime2
建議在datetime
)重新編寫您的程序給出:
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.