我被要求将网站应用程序从一台服务器迁移到另一台服务器。 该代码由之前的开发人员编写。
他使用以下内容创建了一个存储过程: [参数]
@SurveyPeriodConfigID int = -1,
@StartDate DATETIME = NULL,
@EndDate DATETIME = NULL,
@StartTime DATETIME = [9:00:00],
@EndTime DATETIME = [19:00:00],
@Category INT = -1,
@SubcategoryID INT = -1,
@ReportType VARCHAR(50) = null,
@DepartmentID INT = -1,
@FloorID INT = -1,
@RoomID INT = -1,
@IsLazyLoad BIT = 0,
@Day INT = -1
和[WHERE caluse]:
SELECT [fields]
FROM [tables]
WHERE
(DATEPART(dw, rsdm.DateCreated)) != 7 AND (DATEPART(dw, rsdm.DateCreated)) !=1
AND rsdm.DateCreated BETWEEN @StartDate AND @EndDate
AND (CONVERT(VARCHAR(8),rsdm.DateCreated,108) BETWEEN @StartTime AND @EndTime)
AND (@Category = -1 OR rsdm.CategoryCodeID = @Category)
AND (@SubcategoryID = -1 OR rsdm.SubcategoryID = @SubcategoryID)
AND (@DepartmentID =-1 OR rsdm.DepartmentID = @DepartmentID)
AND (@FloorID =-1 OR rsdm.FloorID = @FloorID)
AND (@RoomID =-1 OR rsdm.RoomID = @RoomID)
AND (@Day =-1 OR DATEPART(dw, rsdm.DateCreated) = @Day)
C#代码:
SqlDataReader sqlDataReader = thisCommand.ExecuteReader(CommandBehavior.CloseConnection);
...调用存储过程并返回SqlDataReader。
到目前为止一切顺利。
现在问题...以前旧网站返回了8200行,但现在新网站返回6500行!!!
我在我的电脑上设置我的电脑上的代码和网站我的sql数据库...它返回正确的值8200.然后我改变了web.config指向新的网站sql server ... 6500行!!! / p>
我备份了实时站点sql数据库,并在我的PC上本地恢复了相同的数据库,并对其进行了测试... 8200行!!!
旧网站有Sql server 2005,我的PC有开发人员SQL 2012,而实时服务器有SQL 2012。
然后我在新站点Sql Server上运行sql profiler,解压缩脚本并在相同的sql数据库8200记录上运行脚本!!!
我花了1-2天的时间在这上面,但仍然不知道为什么直播Sql Server会通过sqldatareader返回6500行。
任何建议都将不胜感激。
答案 0 :(得分:3)
我会检查不同服务器上的选项是否配置不同,特别是ANSI_NULLS(参见下面的脚本)。请注意,在SSMS中运行脚本时,默认选项可能与使用ADO.NET时生效的默认选项不同(请参阅SSMS工具/选项/查询执行/ SQL Server / ANSI)。这通常可以解释SSMS和ADO.NET之间的行为差异。
DECLARE @options INT
SELECT @options = @@OPTIONS
PRINT @options
IF ( (1 & @options) = 1 ) PRINT 'DISABLE_DEF_CNST_CHK'
IF ( (2 & @options) = 2 ) PRINT 'IMPLICIT_TRANSACTIONS'
IF ( (4 & @options) = 4 ) PRINT 'CURSOR_CLOSE_ON_COMMIT'
IF ( (8 & @options) = 8 ) PRINT 'ANSI_WARNINGS'
IF ( (16 & @options) = 16 ) PRINT 'ANSI_PADDING'
IF ( (32 & @options) = 32 ) PRINT 'ANSI_NULLS'
IF ( (64 & @options) = 64 ) PRINT 'ARITHABORT'
IF ( (128 & @options) = 128 ) PRINT 'ARITHIGNORE'
IF ( (256 & @options) = 256 ) PRINT 'QUOTED_IDENTIFIER'
IF ( (512 & @options) = 512 ) PRINT 'NOCOUNT'
IF ( (1024 & @options) = 1024 ) PRINT 'ANSI_NULL_DFLT_ON'
IF ( (2048 & @options) = 2048 ) PRINT 'ANSI_NULL_DFLT_OFF'
IF ( (4096 & @options) = 4096 ) PRINT 'CONCAT_NULL_YIELDS_NULL'
IF ( (8192 & @options) = 8192 ) PRINT 'NUMERIC_ROUNDABORT'
IF ( (16384 & @options) = 16384 ) PRINT 'XACT_ABORT'
答案 1 :(得分:1)
既然你提到SSMS和SqlClient
之间的结果不同,我可以想到两个选项
SqlClient
(可能是基于身份)SET
选项不同,导致不同的行为要检查后者,请在SSMS和select @@OPTIONS
中运行SqlClient
,然后进行比较。这里列出了标志:http://www.mssqltips.com/sqlservertip/1415/determining-set-options-for-a-current-session-in-sql-server/
答案 2 :(得分:1)
当您连接到数据库时,始终会有一个与之关联的登录帐户。您使用的应用程序的登录名是否与使用SQL Server Management Studio时使用的登录名不同?日期格式基于登录的默认语言。
请运行以下查询:
Select syslogins.name, syslogins.language, syslanguages.dateformat
From sys.syslogins
Inner Join sys.syslanguages
On syslogins.language = syslanguages.name
检查dateformat列以查看返回的所有登录信息。如果dateformat不同,那么这可能解释了为什么从应用程序运行到从SSMS运行时得到的结果不同。
如果这确实是导致问题的原因,那么您可以按照此博客中的说明更改登录的默认语言:http://blogs.lessthandot.com/index.php/datamgmt/datadesign/setting-a-standard-dateformat-for-sql-se/
答案 3 :(得分:0)
确定问题出在(DATEPART(dw, rsdm.DateCreated)) != 7 AND (DATEPART(dw, rsdm.DateCreated)) !=1
SqlClient用户将DATEFIRST设置为1,其中我的SSMS为7.所有其他与其他sql server实例相同的用户连接都将DATEFIRST设置为7.(还要感谢@" G Mastros"最终确认问题)。
我所做的只是暂时添加SQL脚本SET DATEFIRST 7;
,并将处理用户以后设置1的原因!