Questions tagged «sql-server-2008»

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

2
SQL Agent如何以及何时更新next_run_date / next_run_time值?
我一直在研究T-SQL中的代码,以便使用msdb数据库中的sp_add_jobschedule proc将新日程表添加到SQL Agent作业中。当我添加新计划(通常在特定日期/时间运行一次)并立即查看sysjobschedules和sysschedules中的值时,我可以看到已添加新计划并将其绑定到SQL Agent的job_id工作。但是,next_run_date和next_run_time的值中有0。当我回来在2或3分钟内再次查看它们时,它们中仍然显示0。但是,当我在5或10分钟后再回来时,它现在可以正确显示与下一次计划运行相对应的日期和时间值。 所以我的问题是: 这些值多久更新一次? 更新这些值的过程是什么? 如果我要添加一个计划,例如未来1分钟,那么这是否意味着作业尚未运行,因为next_run_date / time还没有更新? 我用于添加新时间表的代码示例: exec msdb.dbo.sp_add_jobschedule @job_id = @jobID , @name = @JobName , @enabled = 1 , @freq_type = 1 , @freq_interval = 0 , @freq_subday_type = 0 , @freq_subday_interval = 0 , @freq_relative_interval = 0 , @freq_recurrence_factor = 0 , @active_start_date …


2
SQL Agent Powershell上下文参考
在我的新工作中,每个服务器上都有多个命名实例。例如 Server1 \ Dev Server1 \ DevIntegrated 服务器1 \质量检查 我的作品中有一个SQL PowerShell脚本,可以调用OS,调用它,Foo.exe但需要传递命令行参数(连接字符串)。每个实例上都将存在一个SQL Agent作业,其步骤为PowerShell类型,该步骤需要知道当前上下文是什么。即此执行从DevIntegrated开始。 我不希望每个脚本都以...开头 $thisInstance = "Dev" ...特别是因为在接下来的几个月中,当我们迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。 如果启动SQLPS,则可以通过将Get-Location的结果切片和切块或运行来确定实例 (Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName 当SQL Agent启动PowerShell类型的作业时,它将在C:\ windows \ system32中启动,并且该Get-Location路由不起作用,因为它不在SQLSERVER上下文中。我可以更改为该上下文,但是我将位于SQL Server的“根目录”,并且不知道我应该在哪个实例中使用。Invoke-Sqlcmd由于相同的原因,使用路由也不起作用(从技术上讲,它在那里超时了)不是默认实例) 据我所知,我已经列举了所有可以进入工作日志的基本“内容”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated Get-ChildItem Get-Host Get-Location Get-Process Get-PSDrive Get-PSProvider Get-Service Get-TraceSource Get-Variable Get-Process似乎我可以使用它以及通过敲击实例和匹配spid来拼凑事物的一些巫术,但这听起来像是来自地狱的血腥骇客。我必须缺少一些基本的东西,有人可以阐明吗? 研究了PowerShell的替代方法 我调查了其他工作类型,但没有得到满意的解决方案。研究表明,SQL代理下列出的PowerShell为SQLPS,并通过右键单击该代理来启动它的实例,从而自动将我放到正确的位置。如前所述,只有当我将交互式代码粘贴到工作步骤中时,我才知道其中的区别。 作业类型的OS使我进入了相同的状态,因为我无法找到确定哪个实例将我放入命令外壳的方法。当然,我可以sqlcmd并获取的值,@@servername但是如果我知道启动sqlcmd的连接,则无需查询数据库;) 如果启用了TSQL,TSQL可能会起作用,xp_cmdshell但是我不确定它们是否已启用---政府工具,并且在使用非默认设置时可能会感到困惑。即便如此,我仍然沉迷于动态SQL,并失去了PowerShell提供的许多表达能力。 虽然有点麻烦,但我认为第一步要定义一个变量,然后将其传递给后续步骤,但是研究发现这篇文章处理多个作业步骤(BOL) 作业步骤必须是独立的。也就是说,作业无法在作业步骤之间传递布尔值,数据或数字值。但是,您可以使用永久表或全局临时表将值从一个Transact-SQL作业步骤传递到另一步骤。您可以使用文件将运行可执行程序的作业步骤中的值从一个作业步骤传递到另一作业步骤。 我不能使用常见的技巧,例如Foo.exe寻找众所周知的文件/环境变量/注册表设置,因为那样会阻止跨实例的并发执行。 …

3
什么是SQL Server中的ERROR_STATE()?如何使用它?
我读到这ERROR_STATE()可以帮助区分源代码中可能发生相同类型错误的不同状态/位置。但是对我来说,真的不清楚如何使用它。 MSDN指出: ERROR_STATE() 返回导致运行TRY…CATCH构造的CATCH块的错误的状态号。 如何才能真正使用它?可以给我一个例子吗,本参考文章中提供的例子并不能帮助我很好地解释事情吗?

4
“任务管理器”过程正在接管单用户模式的数据库。它是什么?
这是我对stackoverflow提出的问题的重复,但是我被告知,这里的某个人可能会对发生的事情有更好的了解。 我有一个零星的问题,当使用.NET SqlConnection在单用户模式下升级SQL Server时,某些其他应用程序在执行SQL代码时以某种方式登录到数据库中,并把我的过程踢了出去。SqlConnection不会以任何方式关闭或处置。但是某些其他应用程序最终以某种方式最终连接到数据库,这将我踢出连接。 运行sp_who时,我可以看到控制数据库的进程是Command =“ TASK MANAGER”。 任何人都可以告诉我这个过程是什么,它的目的是什么,以及它如何进入一个单用户模式且有活动连接的数据库?

1
我对Merge语句的锁定选项是什么?
我有一个执行MERGE语句的存储过程。 似乎在执行合并时默认情况下会锁定整个表。 我正在事务内调用此存储过程,在该事务中我还在做其他一些事情,但愿它只会锁定受影响的行。 我尝试了提示MERGE INTO myTable WITH (READPAST),但似乎锁得少了。但是ms doc中有一个警告,说它可以插入重复的键,甚至绕过主键。 这是我的表架构: CREATE TABLE StudentDetails ( StudentID INTEGER PRIMARY KEY, StudentName VARCHAR(15) ) GO INSERT INTO StudentDetails VALUES(1,'WANG') INSERT INTO StudentDetails VALUES(2,'JOHNSON') GO CREATE TABLE StudentTotalMarks ( Id INT IDENTITY PRIMARY KEY, StudentID INTEGER REFERENCES StudentDetails, StudentMarks INTEGER ) GO INSERT INTO …

1
ROW_NUMBER()OVER(按B排序,按C排序)不使用(A,B,C)上的索引
考虑以下两个功能: ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C) ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 据我了解,它们产生的结果完全相同。换句话说,在PARTITION BY子句中列出列的顺序无关紧要。 如果有索引,(A,B,C)我希望优化程序在两个变体中都使用此索引。 但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。 我已经在SQL Server 2008 Standard和SQL Server 2014 Express上看到了它。 这是我用来复制它的完整脚本。 在Microsoft SQL Server 2014上尝试-12.0.2000.8(X64)2014年2月20日20:04:26版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation Express Edition(64位) 和Microsoft SQL Server 2014(SP1-CU7)(KB3162659)-12.0.4459.0(X64)2016年5月27日15:33:17版权所有(c)Windows NT 6.1(内部版本7601)上的Microsoft Corporation Express Edition(64位):服务包1) …

2
从生产中刷新测试数据库中的几个表的最佳方法是什么?
我在SQL Server 2008R2中有一个非常大的生产数据库和一个非常大的测试环境数据库。这两个数据库的表结构相似,但用户/登录/权限/角色不同。 我只需要每月从生产中定期刷新测试数据库中的几个表即可。 我正在计划执行此操作的当前方法是 使用BCP实用程序从生产中导出我需要的表。 将bcp导出文件复制到测试服务器上 在测试中刷新的所有表上禁用索引和约束 截断测试数据库表 使用BCP将数据加载回Test数据库表中。 在测试中重建索引并重新启用约束 对于这么小的任务,这一切似乎都太复杂了。似乎还会产生很多重做(在t-log中),是否有更好的方法呢? 我想到的另一种方法是将生产环境中的备份还原到测试环境中-但是我的问题是完整备份会很大,而且我不需要刷新所有表,只需要刷新几个表即可。 -并且生产数据库中的用户和安全性与测试不同。如果还原整个数据库,那么生产数据库中的安全设置将覆盖该设置。

1
CONVERT()导致此问题的原因是什么?
考虑以下两个语句: PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0); 两条语句都返回-1; 那不是很错误,因为第二个二进制值比第一个值高十进制65,536,不是吗? 当然这不能归因于沉默的截断吗? 如果我运行以下语句: PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0); PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0); 出现以下错误: Msg 8114, Level 16, State 5, Line 1 Error converting data type varbinary to numeric. 我如何诊断这里发生了什么? 我正在SQL Server 2012 v11.0.5058上运行它。在SQL Server 2008 R2 SP2,SQL …

2
复合主键效率作为外键
我有一个带有复合主键(由4列组成)的表,该键用于确保没有重复项输入到表中。我现在需要一个新表,该表需要将该表中的键作为外键引用。 我的问题是哪种方法对查找速度更有效: 1)我是否创建包括所有4列的新表,并在外键中引用它们。 要么 2)我是否在主键表中创建了一个新的标识列,并将其用作新表中的外键。 预计该数据库将存储大量数据,因此到目前为止,我已经建立了该数据库,以最大程度地减少每个表中存储的数据量。考虑到这一点,选项2将是最好的方法,因为我将为每行保存2个int列和一个datetime列,但是我想避免不必要的增加查找时间。

1
如果交易是“已提交”的,那么可以确定将其保存吗?
如果事务成功提交,那么我能否100%确保已将其写入数据库和日志文件?我可以确定数据已保存吗? 今天,我们的日志文件已达到驱动器的极限,并且出现了很多错误。此外,其他一些服务崩溃了。我们增加了磁盘并重新启动了服务器。 在启动过程中,服务器进行了“数据库恢复”-我可以确定一切都还好吗?

3
更新具有数百万条记录的表,迄今已有4天
我当前正在更新具有数百万条记录的表,该表已经进行了4天,并且查询仍在执行。 我检查了活动监视器,它显示查询正在运行。 在事件日志中根本没有错误。 性能明智: 磁盘A中的Tempdb(850 GB可用空间) 磁盘B中的数据库文件(750 GB可用空间) 16 GB内存 请建议我该怎么办? 查询 UPDATE dbo.table1 SET costPercentage = ISNULL(t2.PaymentIndex, 1.0), t2.TopUp_Amt = (ISNULL(t2.PaymentIndex, 1.0) - 1.0) * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00), Total_Tariff_Inc_t2 = ISNULL(t2.PaymentIndex, 1.0) * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00) FROM dbo.table2 t2 WHERE LEFT(dbo.test1.procodet, 3) = LEFT(t2.ProviderCode, 3) COLLATE database_default

3
如何在SQL Server权限上刷新AD安全组
我在Small Business Server 2003上使用Sql Server 2008。客户端正在使用WinXP。 我将用户添加到了Active Directory安全组;为什么该用户不能立即访问数据库?似乎在Sql Server中识别用户之前存在延迟。 我将AD安全组明确用于权限,因此不需要在Sql Server中添加单个用户。因此,实际上,我无需执行任何操作,只需将用户添加到AD安全组即可授予访问权限。 但是由于某种原因,Sql Server无法立即识别出该添加项。我已经看过很多次了。我将该用户添加到了组中,但是该用户直到第二天才能访问数据。似乎它不能实时查询Active Directory。你能确认是吗? 我需要做什么,以便Sql Server从Active Directory“刷新”用户列表?

2
如何在单用户模式下删除数据库
如何删除显示DatabaseName (Single User)为名称的数据库? 当我尝试将其删除时,出现以下错误: 更改数据库“ DatabaseName”失败。(Microsoft.SqlServer.Smo) ALTER DATABASE语句失败。(Microsoft SQL Server,错误:5064) 我尝试执行ALTER以下命令,但仍然遇到相同的问题。 ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

1
镜像-无法访问服务器网络地址
我已经安装了SQL Server 2008 R2。它包含三个实例。 默认(MSSQLServer) 第一个例子 第二审 所有这些都是作为网络服务登录。 默认实例是主体服务器,第一个实例是镜像,第二个实例是见证服务器 最初,我对主体数据库进行了完整备份和事务日志备份。通过保持相同的数据库名称将其还原到第一个实例,并且恢复状态为“不可恢复” 最后,我启动了镜像,并收到以下两条错误消息。

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.