Questions tagged «sql-server»

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

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
限制SQL Server上的连接权限
我有一个使用“荣誉系统”安全性的应用程序要部署到生产中。也就是说,所有用户都使用SQL用户/密码凭据连接到数据库,并且该应用程序自行管理权限。对于连接对象包含嵌入式凭据并且可以自由复制的事实,后半部分并没有给我带来多少麻烦。我试图找到一种方法来将连接限制到一组更有限的客户端。我可以创建防火墙规则来限制IP。是否可以通过计算机帐户或域成员资格“预限定” SQL登录名的任何方法?

1
查询计划“基数估计”中的警告
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 上面的查询在查询计划中有一个警告。 <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> 为什么会有警告? 字段列表中的类型转换如何影响基数估计?


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 …


5
将表导出到文本文件的最快方法是什么
我将拥有一个SQL Server 2012数据库和一个包含300万行和50列的表。无人值守的后台.net进程(可能发出一些SQL或Powershell命令)将其导出到文本文件(每一行数据一行)的最快方法是什么?.net进程应知道何时完成导出或是否有任何错误。数据类型将为all int或nvarchar。 我假设使用ado.net来执行select *命令并遍历数据读取器并为每条记录写入文件的纯C#代码将很慢,而且我无法并行处理。 理想情况下,导出将导出到远程共享网络文件夹,而不是SQL Server计算机上的本地文件夹。SQL Server将是一个HA群集。SSIS是否更适合于此,不需要数据转换? .Net进程将在计算机A上运行,在计算机B上运行SQL Server,最终文件目标是网络共享。一种选择是SQL Server将文件直接写入网络共享。另一个选项是SQL Server写入计算机A,然后在写入文件时,.net进程将其复制到网络共享。我没有正式的SLA,但是希望30分钟-1小时的文件写入时间。

3
限制对某些列的更新。只允许存储过程更新这些列
我有一些敏感的价格列,希望仅通过存储过程进行更新。如果不使用用于更新价格的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都会失败。 我正在考虑使用触发器和令牌表来实现。我正在考虑的想法是有一个令牌表。存储过程将必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查令牌表中是否存在已更新行的令牌。如果找到,它将继续。如果找不到令牌,它将引发异常并使更新事务失败。 有没有一种更好/更好的方法来实施此限制?

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

3
我应该使用分离/复制/附加还是通过备份-还原-重放来迁移数据?
我即将着手将数据库文件迁移到新的SAN(从旧的SAN)到abd,我有两种选择来实现。(1)建议我研究将完全备份还原到服务器上新数据库的工作水平。但是,(2)我最初的计划是通过分离然后重新附加数据库将文件从旧SAN复制到新SAN。 我的直觉告诉我,我宁愿分离,复制和附加,因为它看起来似乎更安全,但这可能只是我的天真。我不想在重命名数据库的过程中错过事务或以某种方式“破坏某些东西”。 我想我的问题是,我对BACKUP-RESTORE-Replay选项的怀疑是否合理,该选项还有其他优点或风险?


1
Management Studio关闭时SQL Server性能不佳
我注意到SQL Server 2008 r2 express的奇怪行为: 通常,我的查询执行时间约为650ms,但是如果我打开Management Studio并运行任何简单查询(例如SELECT * FROM Something),则执行时间约为40ms。如果我关闭Management Studio,则此值将恢复正常〜650ms 而且无论查询在哪里执行:从Management Studio或我的应用程序(它使用ADO.Net) ARITHABORT设置无效 为什么会这样呢?
17 sql-server  ssms 

4
平行计划中不正确的“实际”行计数
这是一个纯粹的学术问题,在很大程度上并没有引起问题,我只是想听听对此行为的任何解释。 取得标准的Itzik Ben-Gan交叉联接CTE理货表: USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[TallyTable] ( @N INT ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( WITH E1(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 …
17 sql-server 


3
是否可以通过更新分区键在分区之间移动行?
我认为这将是一个相当简单的问题,但实际上,我很难找到答案。 问题:您是否可以通过简单地更新分区列使其越过分区边界,将分区表中的数据行从一个分区移至另一个分区? 例如,如果我有一个带有分区键的表: CREATE TABLE SampleTable ( SampleID INT PRIMARY KEY, SampleResults VARCHAR(100) NOT NULL, ) 使用映射到主键的分区功能: CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS RANGE LEFT FOR VALUES (10000, 20000); 是否可以通过将SampleID从1更改为(例如)500,000,将行从第一分区移动到第三分区? 注意:我将其标记为sql server 2005和2008,因为它们都支持分区。他们有不同的处理方式吗?

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.