Questions tagged «sql-server-2008»

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

2
为什么我不能使用NEWSEQUENTIALID()作为列的默认值?
我试图在Management Studio中创建一个表,并在阅读了有关新功能(从SQL 2005开始)后NEWSEQUENTIALID(),以为我会尝试一下。 这就是我在做什么: 但这不是让我。我收到的错误消息是: 'FormTemplate (Forms)' table - Error validating the default for column 'FormTemplateId'. 我在这里错过了一个把戏吗?我肯定在运行SQL Server 2008 R2。

3
为什么表的数据空间会占用原始数据大小的4倍?
我有一个具有490 M行和55 GB表空间的表,所以每行约167字节。该表包含三列:a VARCHAR(100),a DATETIME2(0)和a SMALLINT。该VARCHAR字段中文本的平均长度约为21.5,因此原始数据应为每行32字节左右:22 + 2表示VARCHAR,6表示DATETIME2,2表示16位整数。 请注意,上面的空间仅是数据,而不是索引。我正在使用“属性” |“属性”下报告的值 储存| 一般| 数据空间。 当然必须有一些开销,但是每行135个字节似乎很多,尤其是对于大表而言。为什么会这样呢?其他人看到过类似的乘数吗?哪些因素会影响所需的额外空间量? 为了进行比较,我尝试创建一个包含两个INT字段和1 M行的表。所需的数据空间为16.4 MB:每行17个字节,而原始数据为8个字节。另一个带有INT和的测试表与VARCHAR(100)实际表填充相同的文本,每行使用39个字节(44 K行),我希望其中有28个字节。 因此,生产表的开销要大得多。这是因为它更大吗?我希望索引大小大约为N * log(N),但我不明白为什么实际数据所需的空间是非线性的。 在此先感谢您提供任何指导! 编辑: 列出的所有字段均为NOT NULL。实际表在该VARCHAR字段和该DATETIME2字段上按该顺序具有聚集的PK 。对于这两个测试,第一个INT是(集群)PK。 如果很重要:该表记录了ping结果。这些字段是URL,Ping日期/时间和延迟(以毫秒为单位)。数据会不断添加,并且永远不会更新,但是会定期删除数据,以使每个URL每小时仅减少几条记录。 编辑: 这里的一个非常有趣的答案表明,对于具有大量读写的索引而言,重建可能没有好处。就我而言,所消耗的空间是一个问题,但是如果写性能更重要,则松散的索引可能会更好。

3
如何在Sql Server中存储Web服务器日志的'n'天?
为了更快地进行报告和性能分析,我们希望将Web服务器日志插入Sql Server。这将使我们能够实时查看流量模式,问题和速度下降。 我们有一个守护程序,用于侦听来自负载均衡器的请求/响应事件,并将批量插入数据库。 但是,我们每天可获得大约1 GB的日志,而我们只需要保留大约一周的时间(至少以这种原始形式)。 存储此数据的最佳方法是什么,删除旧条目的最佳方法是什么? 我们已经讨论过将每天的数据存储在自己的表中,例如,Log_2011_04_07将具有当天的所有条目,然后删除最旧的表。可以创建一个视图来涵盖所有的日间表格,以方便查询。可行吗?

2
为什么在存储过程中的此查询上不发生SQL注入?
我做了以下存储过程: ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 现在,我尝试做这样的事情。也许我做错了,但是我想确保这样的过程可以防止任何SQL注入: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 下图显示了以上在SSMS中执行的SQL,结果正确显示,而不是错误: 顺便说一句,我在查询完成执行后在分号后添加了该部分。然后我再次执行它,但是当我检查表tblActor是否存在时,它仍然存在。难道我做错了什么?还是这真的防注射?我想我也想问的是这样的存储过程是否安全?谢谢。

2
活页和非活页有什么区别?
我一直在运行一些索引使用情况报告,并且正在尝试获取Leaf和Non-leaf的定义。似乎同时存在叶子和非叶子插入,更新,删除,页面合并和页面分配。我真的不知道这意味着什么,或者一个比另一个更好。 如果有人可以给每个简单的定义,并解释为什么叶子或非叶子很重要,不胜感激!

1
忽略“哪里”的口音
在我们的数据库中,我们有关于caron / hatschek的多个条目。现在,当我们的用户搜索不带caron / hatschek的条目时,他们希望找到这些条目。我将通过一个简单的示例来说明这一点: 在我们的数据库中,我们有条目(带有姓名的联系方式) Millière 所以这个名字在这个人居住的国家是正确的。 在我们的国家/地区,caron / hatschek没有任何字符,因此我们的用户搜索Milliere。没有结果,è显然不匹配e。 我不知道这到底是怎么实现的é,è,ê还有更多可供选择(而这仅是字母一个例子e......)。 (另一种方法会容易得多,因为我可以简单地将所有字母替换为用caron / hatschek替换为基本字母。显然,我们的用户确实希望数据库中使用正确的名称版本,而不是残缺的名称。)


1
编写SQL查询的最佳方法,该方法检查列中是否为非NULL值或NULL
我有一个带有默认值为NULL的参数的SP,然后我想执行以下查询: SELECT ... FROM ... WHERE a.Blah = @Blah AND (a.VersionId = @VersionId OR (@VersionId IS NULL AND a.VersionId IS NULL)); 在WHERE上述检查两个非空值和一个NULL值@VersionId。 就性能而言,最好改用一条IF语句并将查询复制到一个搜索非NULL的查询中,而将另一个复制为NULL的查询,这样会更好吗?: IF @VersionId IS NULL BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah AND a.VersionId IS NULL; ELSE BEGIN SELECT ... FROM ... WHERE a.Blah = @Blah …

2
在调用数据库上下文中执行的中央存储过程
我正在使用该sys.dm_db_index_physical_stats视图开发定制的维护解决方案。我目前有从存储过程中引用它。现在,当该存储过程在我的一个数据库上运行时,它会执行我想要的操作,并拉出与任何数据库有关的所有记录的列表。当我将其放置在其他数据库上时,它会拉出仅与该数据库有关的所有记录的列表。 例如(底部代码): 针对数据库6的查询运行显示了[请求的]数据库1-10的信息。 针对数据库3运行的查询仅显示数据库3的[请求的]信息。 我要对数据库3专门执行此过程的原因是,我希望将所有维护对象保留在同一数据库中。我想把这项工作放在维护数据库中,就像在该应用程序数据库中一样工作。 码: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …

2
来自不同进程的相同临时表上的锁的死锁
我发现一个死锁似乎显示出我认为不可能的事情。死锁涉及两个过程: 1. process8cf948 SPID 63 在临时表#PB_Cost_Excp_Process_Invoices_Work上执行ALTER TABLE。 拥有对象ID 455743580的表#PB_Cost_Excp_Process_Invoices_Work上的IX锁 2. process4cb3708 SPID 72 在UPDATE上对临时表#PB_Cost_Excp_Process_Invoices_Work进行执行,该表应该是它自己的表的唯一副本。 在#PB_Cost_Excp_Process_Invoices_Work上拥有具有相同对象ID 455743580的 Sch-M锁! 这应该是不可能的。我想念什么吗?#Temporary表是否真的在这两个SPID之间重用? 这是在具有累积更新1(版本10.50.4260)的SQL Server 2008 R2 Service Pack 2上。 完整的未更改死锁跟踪如下。请注意,两个进程如何在具有相同表名#PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519的相同对象ID上进行操作: 12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait 12/14/2012 13:46:03,spid23s,Unknown,waiter-list 12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M 12/14/2012 13:46:03,spid23s,Unknown,owner-list 12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580 12/14/2012 …


3
为其他数据库中的内部存储过程使用中央CLR存储过程/函数存储库来使用?
我想使用我在C#CLR中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库设置为可信任并打开CLR并在每个数据库中保留一堆相同的代码。 从管理和安全的角度来看,有没有最佳方法?CLR功能是非常基本的功能,例如字符串分隔符,电子邮件验证,URL编码/解码,base64等。我希望每个数据库中只有dbo模式才能访问这些功能。 有没有简单的方法可以做到这一点? 另外我也不清楚CLR dll是否被嵌入,是否移动数据库,是否带有标签,或者是否也必须移动dll。 谢谢


1
空字符串:为什么或何时“”等于“”?
谁能解释为什么 select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' '); 产量 ----------- ----------- ----------- ----------- ----------- 1 0 0 0 1 有趣的结果是 create table test ( val varchar(10) ); insert into test values( '' ); update test set val = ' …

4
SQL大表设计
我对SQL Server 2008表设计有一个一般性问题。我们目前有一张桌子,容量超过600GB,每天增长约3GB。该表具有适当的索引,但由于其大小而在运行查询时正成为主要的挂断。问题是我应该按年和月将表拆分为多个表(这将适合其他部门如何拆分其大数据集),还是应该利用SQL Server内置的分区。看来使用分区将需要较少的代码更改。从我在分区时读取的内容来看,您仍然仅查询一张表,服务器处理如何获取数据。如果我们使用多表路由,则必须处理从多个表中提取数据。

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.