Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

7
将表移动到另一个SQL2008数据库(包括索引,触发器等)
我需要将一大堆(100多个)大型(数百万行)表从一个SQL2008数据库移动到另一个数据库。 我最初只是使用导入/导出向导,但是所有目标表都缺少主键和外键,索引,约束,触发器等。(标识列也被转换为普通INT,但是我想我只是错过了向导。) 什么是正确的方法? 如果这只是几个表,我将回到源头,编写表定义的脚本(包括所有索引,等等),然后在目标上运行脚本的索引创建部分。但是,有这么多表,这似乎是不切实际的。 如果没有太多数据,我可以使用“创建脚本...”向导来编写包括数据在内的源脚本,但是72m行脚本似乎不是一个好主意!

1
SQL Server 2016错误查询计划每周锁定数据库一次
在过去的5周中,大约每天的同一时间(清晨,可能取决于人们开始使用时的用户活动),每周一次,SQL Server 2016(AWS RDS,已镜像)开始超时查询。 所有表上的UPDATE STATISTICS始终会立即对其进行修复。 第一次之后,我让它每晚(而不是每周)更新所有表上的所有统计信息,但是仍然发生(更新统计信息运行后大约8小时,但并非每天运行)。 上一次,我启用了查询存储,以查看是否可以找到具体的查询/查询计划。我想我可以将其缩小到一个: 找到该查询后,我添加了一个推荐索引,该索引在此不常用的查询中丢失了(但它确实涉及很多常用表)。 错误的查询计划正在执行索引扫描(在只有1万行的表上)。不过,其他返回的查询计划(以毫秒为单位)也用于进行相同的扫描。创建新索引后,最新查询计划仅查找。但是,即使没有该索引,也有99%的时间在几毫秒内返回了索引,但是每周要花40秒以上的时间。 超时的坏消息:http : //brentozar.com/pastetheplan/?id=rymaWt56e 以前不会超时的计划:http : //brentozar.com/pastetheplan/?id=HyN7ftcpe 具有新索引的最新计划:http : //brentozar.com/pastetheplan/?id=ryLuGKcag 从2012年迁移到SQL Server 2016之后,这种情况开始发生。 DBCC CHECKDB不返回任何错误。 新索引会解决问题,使其不再选择错误的计划吗? 我应该“强制”现在行之有效的计划吗? 如何确保其他查询/计划不会发生这种情况? 这是更大问题的征兆吗? 我刚刚添加的索引: CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType]) CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment] ( [ProjectID] ASC, [Start] ASC ) INCLUDE ( …


1
为不同的SQL Server架构设置用户权限
我需要限制对特定用户的访问,但是他们仍然需要能够查看dbo拥有的表中的数据。 我正在尝试执行以下操作: dbo模式具有正常功能,可以访问所有内容 schema1模式只能访问schema1对象 如果schema1视图或存储过程访问dbo拥有的表中的数据,则权限链会适当 user1有权访问schema1,除此之外没有其他权限;#3除外 这是我尝试过的: 创建一个使用随机密码映射到测试登录名的user1用户 在dbo模式中创建了几个表,其中包含一些测试数据 创建一个schema1模式 创建一个schema1.get_profiles,该视图从一个名为schema1.profiles的视图中进行选择,该视图访问dbo.people,dbo.taglinks和dbo.tags中的数据 但是,以user1身份登录时使用以下语句: EXEC get_profiles 1 结果是: The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'. 我已经尝试过WITH EXECUTE AS OWNER并且无法开始理解“所有权链接”应该如何工作。 我也尝试过 GRANT EXECUTE ON SCHEMA::schema1 TO user1 GRANT INSERT ON SCHEMA::schema1 TO user1 GRANT SELECT ON SCHEMA::schema1 …

7
源代码控制下的存储过程,最佳实践
我目前正在使用Tortoise SVN来对.NET Web应用程序进行源代码控制。将我们的SQL Server存储过程纳入Source Control的最佳方法是什么?我目前使用VS 2010作为开发环境,并使用SQL Server数据工具(SSDT)连接到内部SQL Server 2008 R2数据库。 我过去所做的就是将procs保存到.sql文件,并将此文件置于源代码控制下。我确定必须有比这更有效的方法?我可以在生产计算机上的VS2010,SSDT甚至SQL Server上安装扩展吗?


2
根据最大日期返回包含多行的结果集
我有一个子表是这样的: [客户日期表] | Customer ID | Some Date | Balance | +-------------+------------+---------+ | 1 | 2012-04-30 | 20.00 | | 1 | 2012-03-31 | 50.00 | | 2 | 2012-04-30 | 0.00 | | 2 | 2012-03-31 | 10.00 | | 3 | 2012-03-31 | 60.00 | | 3 | …
16 sql-server 

3
比较可以包含NULL的列-有没有更优雅的方法?
我知道您不能将值与NULL进行比较,而不能在不添加以下代码的情况下期望结果... SELECT * FROM A INNER JOIN B ON A.ID = B.ID WHERE A.STRING <> B.STRING OR (A.STRING IS NULL AND B.STRING IS NOT NULL) OR (A.STRING IS NOT NULL AND B.STRING IS NULL) OR A.DT <> B.DT OR (A.DT IS NULL AND B.DT IS NOT NULL) OR (A.DT IS …
16 sql-server  null 

2
在dbo模式下未创建表
在SSMS中创建表时,我已经意识到,如果执行以下语句: CREATE TABLE [tableName]; 该表将在您自己的模式(而不是dbo)下创建。因此,为了在dbo模式下创建它,您需要像这样明确地声明: CREATE TABLE [dbo].[tableName]; 有谁知道一种方法(例如,服务器范围的设置),以便在创建表时不需要指定[dbo]部分?

1
datetime2(0)与datetime2(2)
根据文档datetime2(Transact-SQL): 存储大小 6字节,精度低于3。7 字节,精度3和4。 所有其他精度要求8字节。 的大小datetime2(0),datetime2(1),datetime2(2)使用相同的存储量(6个字节)。 我是否可以在datetime2(2)不增加任何尺寸费用的情况下继续使用并获得精度的好处是否正确? 请注意: 该列用PK索引,以形成复合聚集索引(用于表分区) 我不在乎毫秒 datetime2(0)在where子句中使用或在索引中查找时,CPU效率会更高吗? 这是一个庞大的表,因此最小的优化将有很大的不同。

4
在SQL Server中同步两个数据库
我有两个SQL Server数据库。一个是客户端(Windows应用程序),第二个是服务器上。我想每隔一段时间(例如每2分钟!)同步这两个数据库。 我已经阅读了有关同步的不同方法,例如复制,时间戳,使用触发器的日志表,Microsoft Sync Framework等。 实际上,我不喜欢使用可能是黑匣子的同步方法(例如复制),因为我不希望在更新SQL Server特定表并将其与服务器同步时阻止SQL Server特定表。 在这种情况下,您认为我应该使用哪种方法?请记住,每隔几分钟,我必须将几个表更改从客户端发送到服务器,并且还要从服务器获取两个表更改。 我发现了一种奇怪但又新的方法。是否可以在客户端中记录所有已执行(针对特定首选)的存储过程,并将其参数与.sql文件一起发送到服务器,然后在服务器上执行?在服务器上也会发生同样的情况,并将其发送给客户端。您是否认为这是一种简单但有用的方法? 如果可以的话,请建议我任何有用的方法。非常感谢。 编辑:请记住,这是实时同步,这使其与众不同。这意味着当客户端用户使用表时,与服务器的同步过程必须每隔几分钟进行一次,因此任何表都不得锁定。

2
获取SQL Agent作业的详细输出
我们有一个SQL Server代理作业,该作业运行维护计划以重新索引服务器上的所有数据库。最近,这已失败,但是作业历史记录无法提供足够的信息来诊断问题。 在作业历史记录中,它指出作业失败。该作业已由用户foo \ bar调用。运行的最后一步是步骤1(重建索引)。 在详细信息窗口中,有以下格式的多条消息: Executing query "ALTER INDEX [something] ON [a...".: 0% complete End Progress Progress: 2015-03-15 22:51:23.67 Source: Rebuild Index Task 正在运行的SQL语句被截断,并且我假设该语句的输出也被截断了,这使我无法识别出哪个特定的语句失败以及为什么。有什么方法可以提取这些消息的全文吗?

6
查看具有作业开始时间的SQL Server中正在运行的作业的脚本
如何编写脚本以查看具有作业开始时间的SQL Server中正在运行的作业? SELECT sj.name, sja.run_requested_date, CONVERT(VARCHAR(12), sja.stop_execution_date-sja.start_execution_date, 114) Duration FROM msdb.dbo.sysjobactivity sja INNER JOIN msdb.dbo.sysjobs sj ON sja.job_id = sj.job_id WHERE sja.run_requested_date IS NOT NULL ORDER BY sja.run_requested_date desc;

7
使用DTS导入/导出向导导入数据时如何处理FK约束?
我正在尝试使用SQL Server导入和导出向导将数据从生产数据库复制到开发数据库,​​但是当我这样做时失败,并显示错误“ INSERT语句与FOREIGN KEY约束冲突”,我有40多个表FK约束,是否有一些简单的方法可以解决此问题,而无需编写放置约束/添加constrat脚本? 编辑:我刚刚发现,在我正在运行的Web版本的SQL Server中,DTS不允许您保存软件包。

1
多租户SQL Server数据库中的复合主键
我正在使用ASP Web API,实体框架和SQL Server / Azure数据库构建多租户应用程序(单个数据库,单个架构)。此应用将由1000-5000个客户使用。所有表都将具有TenantId(Guid / UNIQUEIDENTIFIER)字段。现在,我使用的是ID(Guid)的单字段主键。但是,仅使用Id字段,我就必须检查用户提供的数据是否来自/正确的租户。例如,我有一个SalesOrder包含CustomerId字段的表。每次用户发布/更新销售订单时,我都必须检查是否CustomerId来自同一租户。情况变得更糟,因为每个租户可能都有多个出口。然后我要检查TenantId和OutletId。这确实是维护的噩梦,并且对性能不利。 我正在考虑将一起添加TenantId到主键中Id。并可能也添加OutletId。所以在主键SalesOrder表将是:Id,TenantId,和OutletId。这种方法的缺点是什么?使用复合键会严重损害性能吗?复合键顺序重要吗?我的问题有更好的解决方案吗?

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.