Questions tagged «sql-server-2005»

SQL Server 2005(主要版本9.00.xxxx)。还请标记sql-server。

3
当一个表需要太多的外键时,有什么选择呢?
我们有一个基本表,用于定义零件并保存零件号,描述,价格,重量等信息。我们还有大约400个表,这些表引用该基本表并根据零件的类型/类别提供有关零件的其他信息。 我们从使用外键约束开始,以便如果在400个特定于零件的表之一中引用了某个零件,则不能从基表中删除该零件,但是我们很快就达到了SQL Server 2005推荐的最大253个外键。 在这种情况下,是否可以使用外键替代方案来确保数据完整性?访问数据时我们还没有看到性能问题,但是由于查询计划太复杂,更新基表中的现有零件将失败。

1
服务器崩溃后如何还原复制
我们在一个SQL Server 2005实例上有两个数据库,它们之间具有事务复制(作为文章有3个表)。该服务器既充当发布者又充当分发者。 然后服务器上的RAID发生故障。但是.mdf,在崩溃之前,我们设法分离并复制了几乎所有文件。 还原系统后,我们重新安装了SQL Server,还原了系统数据库(主数据库,模型数据库,msdb数据库)并将.mdf文件放置在相同的路径中。就这样开始了。 复制出现问题。尽管“ 本地订阅”文件夹包含有问题的订阅,但“ 本地出版物”文件夹为空。当我尝试添加新出版物时,我得到了: 新发布向导在检索发布名称时遇到一个或多个错误。 执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo) 无效的对象名称“ dbo.syspublications”。(Microsoft SQL Server,错误:208) 我决定尝试删除左侧订阅(最终我设法做到了)并禁用服务器上的发布和分发,这给了我: SQL Server无法禁用“ someserver”上的发布和分发。 无效的对象名称“ dbo.syssubscriptions”。EXECUTE之后的事务计数表明缺少COMMIT或ROLLBACK TRANSACTION语句。上一个计数= 0,当前计数=1。EXECUTE之后的事务计数指示缺少COMMIT或ROLLBACK TRANSACTION语句。上一个计数= 0,当前计数=1。EXECUTE之后的事务计数指示缺少COMMIT或ROLLBACK TRANSACTION语句。上一个计数= 0,当前计数=1。EXECUTE之后的事务计数指示缺少COMMIT或ROLLBACK TRANSACTION语句。上一个计数= 0,当前计数=1。EXECUTE之后的事务计数指示缺少COMMIT或ROLLBACK TRANSACTION语句。先前计数= 0,当前计数=1。将数据库上下文更改为'master'。(Microsoft SQL Server,错误:208) 似乎某些信息未从系统数据库备份中恢复(可能distribution数据库可能丢失了某些内容)。 我也尝试遵循无法禁用发布和分发中给出的答案。但是没有成功。我尝试syspublications同时在master和中创建distribution,但未更改。 那么,如何使复制在该服务器上工作? 试图在服务器上发布一些其他数据库,并且可以正常工作。因此,问题似乎与已发布的数据库有关。如何清除它以管理在其上创建新出版物? System Tables 问题数据库的子文件夹将丢失发布数据库时创建的复制表。 在复制监视器中,我可以看到那些旧的订阅,但在Replication文件夹中不可用 。

1
在48个核心AMD Opteron盒上包含24个物理tempdb文件的TempDB争用
我刚刚收到有关SQL Server 2005实例的以下通知。该实例的核心与tempdb文件比为2:1,总tempdb文件数为24。争用不应发生-我将如何检测这种争用的根源?TempDB和所有其他数据库通过10 GB以太网存储在SAN存储上。SAN具有在一个RAID-60阵列中配置的46个10k SAS驱动器。该阵列与多台VMWare服务器和一台或两台Exchange服务器共享。 来自Idera SQL Diagnostic Manager的通知: 2012年11月8日10:49:00 PM,MGSQL01上的Tempdb争用(ms)至关重要。 在MGSQL01上检测到Tempdb锁存器争用。检测到的总等待时间为1782毫秒。这表明在tempdb中分配映射上的争用会影响性能。如果这是一个经常性的问题,则可以通过遵循有关tempdb文件数,大小和IO子系统的最佳实践来缓解。 PFS等待时间:1782 ms GAM等待时间:0 ms SGAM等待时间:0 ms Tempdb争用(ms):tempdb分配映射(GAM,SGAM和PFS)的当前等待时间,以毫秒为单位。仅在运行SQL 2005或更高版本的实例上会发出此警报。

2
关闭所有SQL Server数据库上的自动收缩。为什么不起作用?
我以为可以使用sp_MSforeachdb解决此问题,但是却收到错误消息。 sp_MSforeachdb ' BEGIN USE [?] DECLARE @dbid INT SET @dbid = DB_ID() IF(@dbid > 4) BEGIN --PRINT ''[?]'' + CONVERT(VARCHAR, @dbid) --ALTER DATABASE [?] SET AUTO_SHRINK OFF END END; ' 如果我在没有注释PRINT行的情况下运行上述查询,则会获得除系统数据库以外的所有数据库的列表。但是,当我取消注释ALTER DATABASE行时,出现以下两个错误消息: 消息5058,级别16,状态2,行9 无法在数据库“ master”中设置选项“ AUTO_SHRINK”。 消息5058,级别16,状态1,行9 无法在数据库“ tempdb”中设置选项“ AUTO_SHRINK”。 这似乎在某种程度上破坏了该操作,因此只有部分数据库被禁用了自动收缩。 知道如何在所有数据库上禁用自动收缩吗?额外的问题:为什么我的方法不起作用?

2
是否可以通过重复TableB将TableA的每一行连接到较小的TableB的行,但是需要多次?
抱歉,标题令人困惑,我不确定在那里写什么。 我有一张有几百条记录的表。我需要将此表的每条记录分配给一个较小的动态用户表,并且用户应交替选择要分配的记录。 例如,如果TableA是 Row_Number()ID 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 并且TableB是 Row_Number()ID 1 1 2 2 3 3 我需要的最终结果是 用户编号RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 …

1
为什么在SQL Server 2005上页面预期寿命为0(零)
我们一直想知道我们SQL Server的页面预期寿命。因此,我们使用Perform查看计数器。该值为零,并且永不更改。我以为一定有错误,所以我检查了SQL Server DMV查询 SELECT [object_name],[counter_name],[cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Manager%' AND [counter_name] = 'Page life expectancy' 整天也返回零。 为了使这一点更有趣,我们检查了“缓冲区高速缓存命中率”计数器,该计数器的平均值约为99-100。 那么,当“缓冲区高速缓存命中率”为100时,页面预期寿命如何为零? 我们缺少什么?如果始终为零,则对我而言意味着没有任何内容保留在缓冲区高速缓存中,如果缓冲区高速缓存命中率为100,这似乎是不正确的? 提前致谢

3
修复孤儿用户“来宾”吗?
如果guest孤立了该特殊用户(未链接到任何登录名),该怎么办? 对于我的一个数据库(SQL Server 2005),执行以下操作会将来宾用户列为孤立用户。 exec sp_change_users_login 'report' 结果: UserName UserSID guest 0x3C2E66759FFBC14F84127D6795C27FD3 如果尝试使用该过程修复来宾用户,则会得到以下信息: exec sp_change_users_login 'update_one', 'guest', 'guest' 终止此过程。在此过程中,“ guest”是登录名参数的禁止值。 如果我尝试删除用户,则会得到: 不能删除用户“来宾”,只能将其禁用。 select * from sys.database_principals where name = 'guest' 结果是: name guest principal_id 2 type S type_desc SQL_USER default_schema_name guest create_date 11/13/98 2:58 AM modify_date 10/16/01 4:31 PM owning_principal_id …

3
如何确定何时创建一个新表来保存可以从查询中获取的数据?
我们有一个付款表,代理商可以得到付款佣金。佣金基于几个不同的因素,例如获得付款所花的时间,因此在确定代理人获得的佣金率时需要进行一些计算,但是没有什么复杂的事情。 例如,它可能永远不会比这更复杂: SELECT Payments.Amount * CASE WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1 WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2 ELSE Rates.Rate3 END 建立第二个表来保存此数据而不是在需要时查询它是否有意义?还是我应该坚持使用运行时查询来在需要时提取数据? 更重要的是,在确定是否需要查询数据时是否应该运行查询,或者是否应该将数据存储在自己的单独表中时,应使用哪些因素?

1
在整个SQL Server数据库上获取统计信息的最有效方法
我想要做的是查看我们的数据库并锁定所有auto-shrink设置,并掌握数据库/表高度分散的情况。 我是否可以运行特定的脚本来了解每个数据库的好主意? 我知道我可以在每个表级别(至少是SQL Server 2005)上运行以下命令: DBCC SHOWCONTIG ('DB.TABLE'); 但是如何运行才能显示数据库中的所有表? 谢谢

2
SQL Server是否具有Date_Format函数?
我发现的只是DateFormat我可以选择的预定义列表,像这样 我记得在MySQL(以及PostgeSQL?)中,您可以定义日期格式: DATE_FORMAT(now(),'&m_%Y') --for 02_2012 etc. SQL Server是否具有相同的功能?我看到人们必须编写一个函数来执行此类操作,它是否具有内置函数? 编辑: 我刚刚找到了DatePart功能。它可以以Month作为数字,但是即使我使用,也总是返回1位数 datePart(MM, getdate())

2
没有参数的EXEC()和sp_executesql之间的区别?
我刚刚了解了新的sp_executesql存储过程。我喜欢这样一种事实,那就是可以在SQL Server中执行参数化的代码。 但是,我想知道没有任何参数时使用sp_executesql存储过程与直接调用EXEC之间有什么区别。另外,有性能暗示吗? exec('select * from line_segment') exec sp_executesql N'select * from line_segment' 此外,2005年和2008年之间是否有区别?还是它们处理这些问题相同?

5
sql服务器并发性能
我们在生产环境中遇到了一些性能问题。 我们发现,当活动会话数增加到25以上时,CPU的使用率将达到100%,并且花费很长时间才能关闭。 我们拥有的环境: 产品Microsoft SQL Server企业版9.3(sp2) CPU 2(至强2.13) 内存7G 会话详细信息1的快照 活动会话 25 活跃交易 496 空闲会话 289 阻止的交易29 会话详细信息的快照2 活动会话 59 活跃交易 885 空闲会话 267 阻止的交易49 我想知道: PS:我们测试了没有并发请求的情况下,一个事务(可读写5个表)在应用程序级别大约需要1秒,因此2个CPU是否可以很好地处理25个活动会话(500个活动事务)。 PS:被阻止的事务主要是由于2个表上的锁引起的。 解决方案是什么:添加CPU或调整应用程序(java / hibernate)以缩短此事务并减少表上的块?

3
SSMS和@@ variable扩展中的SQLCMD模式
将SQLCMD模式与SSMS一起使用时(不是从命令行使用),是否可以将当前服务器和实例分配给变量?这不同于分配普通的TSQL变量。 问题定义 我想使用SQLCMD的变量扩展功能来替代我们部署脚本中的特定于环境的值,而不是我已经走进的现有tsql字符串构建mash。除了当前环境之外,使用SQLCMD处理部署已经非常顺利。 -- -- define 2 sqlcmd variables that will be expanded in scripts -- :setvar dbServer "DEVA2\DEV2" :setvar dbNotServer @@servername SELECT '$(dbServer)' AS hard_coded_value , @@servername AS [servername] , '$(dbNotServer)' AS dbNotServer 并产生以下结果。 hard_coded_value servername dbNotServer DEVA2\DEV2 DEVA2\DEV2 @@servername Meat Loaf说3分之2不错,但我宁愿3分之3的解决方案。当该脚本被部署到测试服务器上时,我不想信任编辑脚本的部署人员。 如果使用SQLCMD的唯一​​解决方案是完全从命令行调用脚本,那么我可以接受,但由于我对使用SQLCMD持绿色态度,因此想将其抛在这里。 所需的输出 :setvar dbNotServer @@servername SELECT '$(dbNotServer)' …

2
对Sql Server 2005中的DBMail进行故障排除
在SQL Server 2005计算机上,我已设置DBMail并正确配置。我可以使用“通知操作员”和EXEC msdb.dbo.sp_send_dbmail将电子邮件排队。 但是问题是排队的邮件永远不会通过。查询时,我在队列中看到10封电子邮件 SELECT * FROM msdb.dbo.sysmail_unsentitems 但是,如果我重新启动 SQL Server服务,则所有邮件都会通过,并且我会在收件箱中收到电子邮件。 到目前为止,这是我唯一能找到的模式。 所以我的问题是:有没有办法对DBmail进行故障排除?我阅读了有关MSDN的一些步骤,但是它们并没有太大帮助。任何对文章有帮助的URL都将不胜感激。

4
TSQL:查找查询分别导致过多的SQL编译和SQL重新编译
我想找出是什么导致性能监视器计数器中出现的高SQL编译(不是重新编译)。 这是我的看法:如果我看到许多SQl编译,则意味着由于以下原因,我们的系统上的查询未得到缓存: 许多特别查询 运行SQl不缓存的查询,例如: UPDATE table1 SET col1 ='字符串长于8000个字符...'WHERE key_column =一些整数 计划正在超时并从缓存中删除,原因如下:缓存空间不足或计划使用时间不够长。 捕获捕获到探查器中的缓存插入的唯一方法是存储过程-> SP:CacheInserts,但它仅负责存储过程缓存。 所以我尝试了以下方法来获取即席查询: SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache. , [cp].[usecounts] , [cp].[objtype] , st.[dbid] , st.[objectid] , st.[text] , [qp].[query_plan] FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st CROSS …

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.