Questions tagged «sql-server-2008-r2»

SQL Server 2008 R2(主要版本10.50.xxxx)。请同时用sql-server标记。

1
DBCC CHECKDB每20-60秒触发一次
我有一个开发环境,正在迅速将其部署到生产环境中,并且在日志中注意到大约每20秒我会看到以下消息: Starting up database 'dbname' CHECKDB for database 'dbname' finished without errors 我注意到了这一点,因为测试此问题的最终用户遇到了一个问题,但我将其隔离为Windows事件日志(应用程序日志)中发现的错误: The log for database 'dbname' is not available. Check event log for related messages. 顺便说一句,我没有找到相关消息,但是通过离线/在线周期解决了。 我唯一能想到的是该应用程序每1毫秒收集一次数据,但是不会将所有这些数据插入数据库中。作为开发服务器,已对其进行了配置,以使日志和数据位于同一驱动器上。考虑到这两条信息,我倾向于将其作为IO问题,并且服务器正在尝试从与存储(SAN)的连接断开中恢复。但是,即使这对我来说也没有意义,因为它不会丢失所有数据库,而只是丢失所有数据库。还有什么可能导致这种情况? 平台:Windows Server 2008 R2上的SQL Server 2008 R2(Ent。)(标准)

3
在SQL Server的表上具有多个可为空的FK是否被视为一种不好的做法
在SQL Server的数据库结构中,我有3种类型的产品,它们需要有关订单的不同信息。所以,我创建了一个Customers桌子,三个不同的顺序表:OrdersForProductAs,OrdersForProductBs,OrdersForProductCs。所有订单表在表上都有一对多的关系Customers。 我还有另一个表格,Payments里面将保存付款明细。但是我在这里对如何组织感到怀疑。 因为我有多种产品类型,并且一个客户可能同时具有多个产品的订单,所以我需要将这三个订单表与Payments表相关联。 另一个问题是,客户只能订购一种产品。因此,表上的FK列Payments需要为nullable。 我的问题是nullable,从长远来看,那些FK色谱柱是否会让我头疼?一般来说,在表上具有可空的FK列是否会被视为不好的做法?

5
SQL Server 2008全文索引似乎从未完成
我们的网站具有一个SQL Server 2008 R2 Express Edition数据库,该数据库具有用于我们网站搜索的全文索引。每次在其中一个索引表中添加或更新新记录时,索引过程似乎永远不会完成。 在过去的几周中,我一直在使用此网站上的基本相同的查询来监视状态:http : //www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this这么长时间的人口 这是我运行查询时看到的(单击以查看完整大小): 索引表中的最新记录永远不会完成,并且不可搜索。即使表中没有太多数据,我也已经等了几天看索引是否完成,但是什么都没有改变。 我能够成功完成索引编制的唯一方法是重建目录或删除并重新创建所有索引。 每次这样做,一旦添加了第一个新记录,就会再次出现相同的问题。 以下是服务器统计信息,以防万一: 四核AMD Opteron 2.34GHz 4GB RAM Windows Server 2008 R2企业SP1 x64 具有高级服务x64的SQL Server 2008 R2 Express Edition

3
我的用户属于哪个广告组登录?
我不确定是否为该问题选择了正确的标题。我真正要追求的是,​​给定单个Windows AD用户,我想找出有权访问此服务器中特定数据库的Windows AD组(登录)的列表。 当我运行以下查询时 select name, principal_id, type, type_desc, default_schema_name, create_date, modify_date, owning_principal_id, sid, is_fixed_role from sys.database_principals 在我的服务器上 Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日00:54:03版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation标准版(64位) 我得到以下结果(部分列表): 我需要知道特定登录名的所有权限。此登录名可以通过AD组访问我的服务器/数据库。 1)从上面的列表中,我的登录名属于哪个广告组? 我一直在下面进行此操作,但是我真的很想找出该用户所属的AD组(根据上图可以访问此服务器的列表)的列表。 首先,我以相关用户身份执行 EXECUTE AS LOGIN='mycompany\HThorne' DECLARE @User VARCHAR(20) SELECT @USER = SUBSTRING(SUSER_SNAME(), CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME())) 我确保我拥有正确的凭据 …

4
相互验证两个表的快速方法
我们正在执行ETL流程。说完所有的话,有一堆表应该是相同的。验证那些表(在两个不同服务器上)实际上是否相同的最快方法是什么。我在说模式和数据。 我可以像在单个文件或文件组上一样对表进行哈希运算吗?可以相互比较。我们有Red-Gate数据比较,但是由于有问题的表包含数百万行,因此我希望每个表都具有更高的性能。 一种吸引我的方法是对联合声明的创造性使用。但是,如果可能的话,我想进一步探讨一下哈希概念。 发布答复更新 对于任何未来的参观者……这就是我最终采取的确切方法。效果很好,我们正在每个数据库中的每个表上执行此操作。感谢下面的回答为我指出了正确的方向。 CREATE PROCEDURE [dbo].[usp_DatabaseValidation] @TableName varchar(50) AS BEGIN SET NOCOUNT ON; -- parameter = if no table name was passed do them all, otherwise just check the one -- create a temp table that lists all tables in target database CREATE TABLE #ChkSumTargetTables ([fullname] varchar(250), [name] …


5
根据前一个月末的值填充丢失的数据
给定以下数据: create table #histories ( username varchar(10), account varchar(10), assigned date ); insert into #histories values ('PHIL','ACCOUNT1','2017-01-04'), ('PETER','ACCOUNT1','2017-01-15'), ('DAVE','ACCOUNT1','2017-03-04'), ('ANDY','ACCOUNT1','2017-05-06'), ('DAVE','ACCOUNT1','2017-05-07'), ('FRED','ACCOUNT1','2017-05-08'), ('JAMES','ACCOUNT1','2017-08-05'), ('DAVE','ACCOUNT2','2017-01-02'), ('PHIL','ACCOUNT2','2017-01-18'), ('JOSH','ACCOUNT2','2017-04-08'), ('JAMES','ACCOUNT2','2017-04-09'), ('DAVE','ACCOUNT2','2017-05-06'), ('PHIL','ACCOUNT2','2017-05-07') ; ...表示何时将给定用户分配给帐户。 我正在寻找谁在每个月的最后一天(分配的日期是该帐户转移所有权的日期)拥有给定帐户的人,并填充所有缺少的月末(可能是从dates我可用的便捷表中创建的,具有有用的列DateKey,Date并且LastDayOfMonth,[由@AaronBertrand提供] 1。 理想的结果将是: PETER, ACCOUNT1, 2017-01-31 PETER, ACCOUNT1, 2017-02-28 DAVE, ACCOUNT1, 2017-03-31 DAVE, ACCOUNT1, 2017-04-30 FRED, ACCOUNT1, 2017-05-31 FRED, …

3
在“创建唯一索引”的“ WHERE”子句中使用“ LEN”函数
我有这张桌子: CREATE TABLE Table01 (column01 nvarchar(100)); 我想在条件为LEN(column01)> = 5的情况下在column01上创建唯一索引 我试过了: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; 我有: 表'Table01'上筛选索引'UIX_01'的WHERE子句不正确。 和: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; 产生: 无法在表“ Table01”上创建过滤索引“ UIX_01”,因为过滤表达式中的“ column01_length”列是计算列。重写过滤器表达式,使其不包括此列。


4
计算总访问量
我正在尝试编写一个查询,其中我必须通过照顾重叠的日子来计算客户的访问次数。假设itemID 2009的开始日期为23日,结束日期为26日,因此项目20010在这几天之间,我们将不将此购买日期添加到我们的总数中。 示例场景: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 2015-01-27 5 0 20014 2015-01-29 2015-01-30 2 2 输出应为7 …

1
在SSIS包中创建事务时出现问题
我正在处理需要使用事务的程序包,但当前出现以下错误: SSIS package "CATS-Package.dtsx" starting. Information: 0x4004300A at Data Flow Task, SSIS.Pipeline: Validation phase is beginning. Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container. Error: 0xC001401A at CATS-Package: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not available.". …

4
将来自不同表的数据聚合到一个表中是不明智的做法吗?
背景 我为大量的健康记录数据库写了很多大型报告(写SP,函数,作业等)。原始模式和使用该模式的软件均来自其他供应商,因此我在结构上不能做太多更改。有许多需要跟踪的记录,例如实验室,程序,疫苗等,它们分散在数十张表中,其中许多表肿且索引不正确(我已经能够解决此问题)。 问题 问题是,由于我们对数据库的控制很少,并且可以从任何给定的更新或补丁进行更改,因此使得编写和维护这些报告变得困难而乏味-特别是在存在大量重叠的情况下。它所需要的只是一个补丁,我被困在重写大量报告中的大部分。此外,随着联接,嵌套选择和应用堆积,查询很快变得混乱而缓慢。 我的“解决方案” 我的计划是将所有这些记录写入一个“全部捕获”表,并在原始表上写入触发器以维护该聚合表中的记录。当然,我需要确保触发器在更新后完好无损,但是从可维护性的角度来看,并且仅引用数据,这样做会容易得多。 该表又细又长,仅存储所需的数据,如下所示: CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id VARCHAR(50) NULL, status VARCHAR(15) NULL, ordered_datetime DATETIME NULL, completed_datetime DATETIME NULL, CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id) ) 然后,我将使用各种关系表来处理诸如type_id和项目分组之类的事情。 我开始对这个想法进行第二次猜测,因为其中一些表已写入很多,我要编写的SP和报告也将大量引用数据。因此,我担心此表将成为具有这么多I / O的记录锁定和性能噩梦。 …

2
有关PIVOT查询的帮助
我有一个具有以下结构的表: CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION]( [SCHEMA_VER_MAJOR] [int] NOT NULL, [SCHEMA_VER_MINOR] [int] NOT NULL, [SCHEMA_VER_SUB] [int] NOT NULL, [SCHEMA_VER_DATE] [datetime] NOT NULL, [SCHEMA_VER_REMARK] [varchar](250) NULL ); 一些示例数据(似乎是sqlfiddle的问题。因此,请放置一些示例数据): INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build') INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK]) VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored …

1
统计信息是最新的,但估计不正确
当我这样做时dbcc show_statistics ('Reports_Documents', PK_Reports_Documents),报告ID 18698会得到以下结果: 对于此查询: SELECT * FROM Reports_Documents WHERE ReportID = 18698 option (recompile) 我得到一个查询计划,该计划使聚簇索引PK_Reports_Documents按预期进行。 但是令我感到困惑的是估计行数的错误值: 根据此: 当示例查询WHERE子句值等于直方图RANGE_HI_KEY值时,SQL Server将使用直方图中的EQ_ROWS列来确定等于的行数。 这也是我期望的样子,但是在现实生活中情况并非如此。我还尝试RANGE_HI_KEY了由提供的直方图中存在的其他一些值,show_statistics并经历了相同的情况。就我而言,此问题似乎导致某些查询使用非常不理想的执行计划,导致执行时间为几分钟,而我可以通过查询提示使其在1秒内运行。 总而言之:有人可以解释一下为什么EQ_ROWS直方图中的行数不用于估计行数以及不正确的估计值来自何处吗? 更多(可能有帮助)的信息: 自动创建统计信息已打开,并且所有统计信息都是最新的。 正在查询的表大约有8000万行。 PK_Reports_Documents是由ReportID INT和组成的组合PKDocumentID CHAR(8) 该查询似乎总共加载了5个不同的统计对象,所有这些对象都包含ReportID+表中的其他一些列。它们都已全新更新。RANGE_HI_KEY下表中的是直方图中最高的上限列值。 +-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+ | name | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

3
如何可靠地确定给定的SQL Server实例是否具有“内存中的锁定页”权限?
可以将“锁定页面在内存中”权限授予SQL Server使用的服务帐户。这使SQL Server可以防止将内存分页到磁盘。 我注意到我们的几台SQL Server计算机没有配置本地策略以允许对SQL Server使用的服务帐户拥有此权利。由于我们有大量的服务器,因此最好使用“本地系统策略”管理控制台手动检查每台服务器。 是否可以使用T-SQL查询,扩展存储过程或其他一些方法来确定所讨论的服务器是否正确? 我不想使用EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';它,因为它依赖于检查当前的SQL Server错误日志。并且该错误日志可能不包含相关条目,前提是自从上次重新启动服务器以来,该日志已被翻转。我知道我可以检查通过修改第一个参数旧日志0来1等,但我们只保留10个错误日志,这可能是不够的。我想要确认设置的故障保护方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.