C# 正常工作但不通过sp_executesql的TSQL
我有一些C代码如下所示:C# 正常工作但不通过sp_executesql的TSQL,c#,sql-server,sql-server-2008,datetime,C#,Sql Server,Sql Server 2008,Datetime,我有一些C代码如下所示: string strSql = "SELECT DISTINCT A." + strProcessingDateColumn + " FROM GA_Item A " + " WHERE A.TOWControlID = @TOWControlID" + " AND A.ItemTypeExt = 'PDF' " + " AND A." + strSourceColumn + " = 'Teller Rep
string strSql = "SELECT DISTINCT A." + strProcessingDateColumn
+ " FROM GA_Item A "
+ " WHERE A.TOWControlID = @TOWControlID"
+ " AND A.ItemTypeExt = 'PDF' "
+ " AND A." + strSourceColumn + " = 'Teller Report' "
+ " AND A." + strReportNumberColumn + " = @ReportNum "
+ " AND A." + strIBTColumn + " <> '9999' "
+ " AND ISNULL(A." + strMergedColumn + ", 'N') = 'N'"
+ " AND CAST(LTRIM(RTRIM(A." + strProcessingDateColumn + ")) AS DATETIME) < @ProcessingDate";
using (SqlCommand command = new SqlCommand(strSql, conn))
{
command.Parameters.AddWithValue("@TOWControlID", iTOWControlID);
command.Parameters.AddWithValue("@ReportNum", iReportNumber.ToString());
command.Parameters.AddWithValue("@ProcessingDate", dtCurrentDate);
try
{
using (SqlDataReader datereader = command.ExecuteReader())
{
while (datereader.Read())
{
//...
}
}
}
}
exec sp_executesql N'SELECT DISTINCT A.UserField1 FROM GA_Item A
WHERE A.TOWControlID = @TOWControlID
AND A.ItemTypeExt = ''PDF''
AND A.UserField4 = ''Teller Report''
AND A.UserField3 = @ReportNum
AND A.UserField2 <> ''9999''
AND ISNULL(A.UserField5, ''N'') = ''N''
AND CAST(LTRIM(RTRIM(A.UserField1)) AS DATETIME) < @ProcessingDate'
,N'@TOWControlID int,@ReportNum nvarchar(1),@ProcessingDate datetime'
,@TOWControlID=9999
,@ReportNum=N'6'
,@ProcessingDate='2015-03-24 00:00:00'
declare @TOWControlID int = 9999,
@ReportNum nvarchar = '6',
@ProcessingDate datetime = '2015-03-24'
SELECT DISTINCT A.UserField1 FROM GA_Item A
WHERE A.TOWControlID = @TOWControlID
AND A.ItemTypeExt = 'PDF'
AND A.UserField4 = 'Teller Report'
AND A.UserField3 = @ReportNum
AND A.UserField2 <> '9999'
AND ISNULL(A.UserField5, 'N') = 'N'
AND CAST(LTRIM(RTRIM(A.UserField1 AS DATETIME))) < @ProcessingDate
查询按预期工作
奇怪的是,这段代码过去在SQL 2000中工作,但我们已经将系统迁移到使用SQL 2008,现在我们遇到了这个问题。我在SQL 2000中遇到了一个问题,除非datetime相等条件是列表中的最后一个条件,否则直接向上查询将拒绝运行,因此,一旦我们将其移到列表的底部,它就可以正常运行数月
我已经检查了一遍又一遍,我看不出我给出的数据有任何错误,也看不到表中的数据有任何错误。我可以将UserField1中的每个值(nvarchar256)转换为datetime,在单独的查询中没有问题
我错过什么了吗
表的模式非常大,所以我不会在这里发布全部内容,但它基本上可以归结为UserField1-20 nvarchar256,null,TOWControlID int null,以及itemtypeextnvarchar50,null
我还应该注意,如果从sp_executesql语句中删除和CASTLTRIMRTRIMA.UserField1 AS DATETIME<@ProcessingDate,则查询将运行,但不会得到正确的结果
所有内容都指向表中的数据错误,但如果我运行此命令:
declare @TOWControlID int = 9999,
@ReportNum nvarchar = '6',
@ProcessingDate datetime = '2015-03-24'
SELECT CAST(LTRIM(RTRIM(A.UserField1)) FROM GA_Item A
WHERE A.TOWControlID = @TOWControlID
AND A.ItemTypeExt = 'PDF'
AND A.UserField4 = 'Teller Report'
AND A.UserField3 = @ReportNum
AND A.UserField2 <> '9999'
AND ISNULL(A.UserField5, 'N') = 'N'
查询执行良好。您需要明确设置日期格式,请参阅 在升级到SQL2008后,默认语言是否更改,请参阅
您需要明确设置日期格式,请参见 在升级到SQL2008后,默认语言是否更改,请参阅
您需要明确设置日期格式,请参见 在升级到SQL2008后,默认语言是否更改,请参阅
您需要明确设置日期格式,请参见 在升级到SQL2008后,默认语言是否更改,请参阅
执行子选择以获取转换的日期,如果无法转换,则执行错误日期,然后与该日期进行比较
CASE
WHEN ISDATE(LTRIM(RTRIM(A.UserField1))) = 1
THEN CONVERT(datetime, LTRIM(RTRIM(A.UserField1)))
ELSE @ProcessingDate END as convertedDate
and convertedDate < @ProcessingDate
似乎没有指定where子句的求值顺序。因此,应被其他条款排除在外的非日期可被评估为日期,除非免责条款恰好首先运行
执行子选择以获取转换的日期,如果无法转换,则执行错误日期,然后与该日期进行比较
CASE
WHEN ISDATE(LTRIM(RTRIM(A.UserField1))) = 1
THEN CONVERT(datetime, LTRIM(RTRIM(A.UserField1)))
ELSE @ProcessingDate END as convertedDate
and convertedDate < @ProcessingDate
似乎没有指定where子句的求值顺序。因此,应被其他条款排除在外的非日期可被评估为日期,除非免责条款恰好首先运行
执行子选择以获取转换的日期,如果无法转换,则执行错误日期,然后与该日期进行比较
CASE
WHEN ISDATE(LTRIM(RTRIM(A.UserField1))) = 1
THEN CONVERT(datetime, LTRIM(RTRIM(A.UserField1)))
ELSE @ProcessingDate END as convertedDate
and convertedDate < @ProcessingDate
似乎没有指定where子句的求值顺序。因此,应被其他条款排除在外的非日期可被评估为日期,除非免责条款恰好首先运行
执行子选择以获取转换的日期,如果无法转换,则执行错误日期,然后与该日期进行比较
CASE
WHEN ISDATE(LTRIM(RTRIM(A.UserField1))) = 1
THEN CONVERT(datetime, LTRIM(RTRIM(A.UserField1)))
ELSE @ProcessingDate END as convertedDate
and convertedDate < @ProcessingDate
似乎没有指定where子句的求值顺序。因此,应被其他条款排除在外的非日期可被评估为日期,除非免责条款恰好首先运行
你能给我们看一下表定义吗?@rbaryyoung看看我的更新。这个表很大,所以我只发布了相关的表。。。这似乎就是问题所在。该列中是否有任何null、空字符串或非日期时间格式的值?从GA_项a中选择CASTLTRIMRTRIMA.UserField1作为日期时间,然后查看是否出现错误。如果是,则该表中存在数据问题。要确定是参数读取错误,还是列读取错误,即使您已经测试了该列,但请耐心等待,请尝试向select语句中添加@ProcessingDate,CASTLTRIMRTRIMA.UserField1 AS DATETIME,并删除包含它们的where子句。让它运行,如果出现错误,请删除一个,然后重试,重复反向操作,您应该能够知道哪一个出现了实际问题。您可以向我们显示表定义吗?@rbaryyoung请参阅我的更新。这个表很大,所以我只发布了相关的表。。。这似乎就是问题所在。该列中是否有任何null、空字符串或非日期时间格式的值?从GA_项a中选择CASTLTRIMRTRIMA.UserField1作为日期时间,然后查看是否出现错误。如果是,则该表中存在数据问题。要确定是参数读取错误,还是列读取错误,即使您已经测试了该列,但请耐心等待,请尝试向select语句中添加@ProcessingDate,CASTLTRIMRTRIMA.UserField1 AS DATETIME,并删除包含它们的where子句。让它运行,如果出现错误,请删除一个,然后重试,重复反向操作,您应该能够知道哪一个出现了实际问题。您可以向我们显示表定义吗?@rbaryyoung请参阅我的更新。这个表很大,所以我只发布了相关的表。。。这似乎就是问题所在。您是否有任何空字符串或非日期时间表单
该列中的已尝试值?从GA_项a中选择CASTLTRIMRTRIMA.UserField1作为日期时间,然后查看是否出现错误。如果是,则该表中存在数据问题。要确定是参数读取错误,还是列读取错误,即使您已经测试了该列,但请耐心等待,请尝试向select语句中添加@ProcessingDate,CASTLTRIMRTRIMA.UserField1 AS DATETIME,并删除包含它们的where子句。让它运行,如果出现错误,请删除一个,然后重试,重复反向操作,您应该能够知道哪一个出现了实际问题。您可以向我们显示表定义吗?@rbaryyoung请参阅我的更新。这个表很大,所以我只发布了相关的表。。。这似乎就是问题所在。该列中是否有任何null、空字符串或非日期时间格式的值?从GA_项a中选择CASTLTRIMRTRIMA.UserField1作为日期时间,然后查看是否出现错误。如果是,则该表中存在数据问题。要确定是参数读取错误,还是列读取错误,即使您已经测试了该列,但请耐心等待,请尝试向select语句中添加@ProcessingDate,CASTLTRIMRTRIMA.UserField1 AS DATETIME,并删除包含它们的where子句。让它运行,如果你得到一个错误,删除一个,然后再试一次,重复反向操作,你应该能够知道哪一个给出了实际的问题我如何使用参数化查询来做到这一点?你需要在C代码中进行更改,以SQL期望的格式发送日期03-24-2015。。。或者将数据库中的dateformat选项更改为ymd而不是mdy,后者是默认的dbcc useroptions->dateformat如何使用参数化查询实现此操作?您需要在C代码中进行更改,以便以SQL期望的2015年3月24日的格式发送日期。。。或者将数据库中的dateformat选项更改为ymd而不是mdy,后者是默认的dbcc useroptions->dateformat如何使用参数化查询实现此操作?您需要在C代码中进行更改,以便以SQL期望的2015年3月24日的格式发送日期。。。或者将数据库中的dateformat选项更改为ymd而不是mdy,后者是默认的dbcc useroptions->dateformat如何使用参数化查询实现此操作?您需要在C代码中进行更改,以便以SQL期望的2015年3月24日的格式发送日期。。。或者将数据库中的dateformat选项更改为ymd,而不是mdy,后者是默认的dbcc useroptions->dateformat。我将在代码中输入该选项并确认其正常工作后立即执行。我在ManagementStudio中试用过它,它很高兴。我会尽快将它放入代码中并确认它可以工作。我在ManagementStudio中试用过它,它很高兴。我会尽快将它放入代码中并确认它可以工作。我在ManagementStudio中试用过它,它很高兴。我会尽快将它放入代码中并确认它可以工作。我在管理工作室试过,很开心。