标签: sql-server-2005

运行多个远程作业

我需要从 sql server 2005 实例(本地服务器)在 150 多个 sql server 实例(sql server 2000,远程)上手动运行作业。所有这些实例的工作都是一样的。作业只是调用一个没有参数的存储过程,这在所有实例中也是一样的。这些工作按计划进行。但是现在他们希望我根据请求为所有实例或指定实例手动运行作业。

这方面的最佳做法是什么?我试过 openrowset 来调用远程存储过程。但是每次运行作业都需要几分钟,所以如果我使用循环来运行所有这些作业,它将一个接一个地运行,这是很长的时间。理想情况下,它应该能够在每个实例上运行存储过程,而无需等待它完成。更理想的是,它应该能够在每个实例上运行作业而无需等待它完成,因此它可以在每个实例的作业历史记录中留下记录。

并且存储过程来自第三方,因此无法更改。

更新:

由于“人们”要求从 SSRS 报告中对其进行初始化,因此使用 SSRS 在服务器上调用一些 T-SQL/proc 是最合适的。我现在遇到的问题是,在使用 OPENQUERY 或 OPENROWSET 从本地服务器调用远程 SQL Server 2000 实例上的 msdb.dbo.sp_start_job 时,我遇到了无法跟随错误。

处理对象“exec msdb.dbo.sp_start_job @job_name = 'xxx'”。链接服务器“xxx”的 OLE DB 提供程序“SQLNCLI”指示对象没有列或当前用户没有该对象的权限。

我想这可能是因为 sp_start_job 不返回任何内容,因为我可以使用 OPENQUERY/OPENROWSET 调用其他远程 proc 没有问题。那么有什么解决方法吗?

更新:

我发现它在 t-sql 中实际上非常简单。

EXEC [linkedServerName].msdb.dbo.sp_start_job @job_name = 'test2'

所以我不需要使用 OPENROWSET/OPENQUERY atually 因为所有远程 SQL Server 2000 实例都已添加为远程服务器。

sql-server-2005 sql-server sql-server-agent

5
推荐指数
1
解决办法
2573
查看次数

进程试图解锁不属于它的资源

SQL Server 2005 SP4 32 位

我有一个每晚运行的 DBCC CHECKDB 作业。昨晚,在工作开始后不久,我收到了以下错误。数据库未处于可疑模式,当我现在运行它时 CHECKDB 恢复干净。数据库是完全可访问的。我应该担心吗?我不想在这一点上回到备份。

 2013-04-02 02:10:55.53 spid56      Error: 1203, Severity: 20, State: 1.
 2013-04-02 02:10:55.53 spid56      Process ID 56 attempted to unlock a resource it
                                    does not own: PAGE: 34:1:388664. Retry the 
                                    transaction, because this error may be caused 
                                    by a timing condition. If the problem persists, 
                                    contact the database administrator.
 2013-04-02 02:10:55.58 spid56      Error: 3314, Severity: 17, State: 3.
 2013-04-02 02:10:55.58 spid56      During undoing of a logged operation in 
                                    database 'MY_DATABASE_NAME', …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server backup maintenance errors

5
推荐指数
1
解决办法
1709
查看次数

带有参数化 LIKE 的意外表扫描

参数化LIKE语句时,我在 SQL Server 2005 上遇到了针对堆表的意外表扫描......但是当与变量相同的值被硬编码时,会发生预期的索引查找。

这个问题只发生在这种特定的情况下......所以我对如何解决这个问题并不感到困惑,我对为什么会发生这种情况感到困惑。

以下 T-SQL 应在 SQL Server 2005 上重现该问题:

IF (OBJECT_ID('tempdb.dbo.#tblTest') IS NOT NULL)
    DROP TABLE dbo.#tblTest
GO

CREATE TABLE dbo.#tblTest (
    ID INT IDENTITY(1, 1),
    SerialNumber VARCHAR(50)
)
GO

-- Populate the table with 10,000 rows
SET NOCOUNT ON
DECLARE @i INT
SET @i = 0

WHILE @i < 10000
BEGIN
    INSERT INTO dbo.#tblTest VALUES(CAST(@i AS VARCHAR(10)))
    SET @i = @i + 1
END
GO

-- To recreate the issue, the …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server t-sql

5
推荐指数
1
解决办法
1130
查看次数

多语句 TVF 上的 WITH SCHEMABINDING 是否会改进基数估计?

根据查询性能和多语句表值函数等文章,SQL Server 假设多行表值函数返回一行。如果它实际上返回许多行,这会导致为调用语句选择一个糟糕的执行计划。

添加SCHEMABINDING到函数是否会导致函数返回值集的基数估计更正确?

如果我们假设我们将一个UserId传递给这个函数并返回一个RecordId值的表,该表允许用户访问,并且一些用户只被允许查看一些记录,而一些用户被允许查看很多甚至所有记录,函数或调用语句(或包含它们的过程)是否会从使用中受益RECOMPILESCHEMABINDING函数中的使用会改变这个答案吗?

我意识到我可以通过实验来解决这个问题,但我希望有人已经找到了答案。指向有详细记录的地方的指针会有所帮助。

sql-server-2005 sql-server functions cardinality-estimates

5
推荐指数
1
解决办法
1374
查看次数

如何在存储过程的全文中搜索值?

当我想查找特定值时,我使用以下脚本来搜索所有存储过程的文本。

SELECT ROUTINE_NAME, ROUTINE_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE @searchText
ORDER BY ROUTINE_NAME   
Run Code Online (Sandbox Code Playgroud)

我最近发现ROUTINE_DEFINITION在 4000 个字符后停止,所以一些程序没有在应该返回的时候返回。

如何查询存储过程的全文以获取值?

sql-server-2005 sql-server stored-procedures information-schema

5
推荐指数
2
解决办法
1万
查看次数

下一步同时(非顺序)运行两个 SQL 代理作业

完成第 1 步后,作业当前转到第 2 步 - osql 命令以在另一台服务器上启动 Sql 代理作业。但是,在第 1 步完成时,我还想在与第 1 步 SQL 代理作业相同的服务器上启动并发 SQL 代理作业。现在,作业是级联的,但我真的希望“作业 2”和“作业 3”同时运行。关于如何使步骤不连续的任何想法?

sql-server-2005

5
推荐指数
1
解决办法
3473
查看次数

经过 5 年的工作,SQL Server 2k5 表现在锁定,无需对数据库进行任何更改

我有一张桌子:OrderDetails

5 年来,只发生了奇怪的死锁。如果它发生了,它发生在OrderDetails表上的索引上现在突然间,死锁无处不在 - 发生的时间很短。我们没有对应用程序或数据库进行任何更改 - 每周都会重建索引。

问题是OrderDetails现在桌子有时会被锁住,所有的地狱都崩溃了

有人可以帮忙看看他们是否从日志中发现任何东西:我怎样才能摆脱整个OrderDetails表上的 objectLock ?为什么表会锁定 - 过去只有索引会导致死锁。这是否意味着索引未能找到合适的记录,现在整个表都被锁定了?

这是一个Update和一个Select在这里死锁,并且被锁定的行不相关 - 它们没有相同的参考号或OrderID

 spid18s,Unknown,waiter id=process91bb58 mode=X requestType=convert
 spid18s,Unknown,waiter id=process9a9018 mode=S requestType=convert
 spid18s,Unknown,waiter-list
 spid18s,Unknown,owner id=process9a9018 mode=IS
 spid18s,Unknown,owner id=process91bb58 mode=IX
 spid18s,Unknown,owner-list
 spid18s,Unknown,objectlock lockPartition=0 objid=1194487334 subresource=FULL dbid=5 objectname=CompZ.dbo.OrderDetails id=lock32163640 mode=IX associatedObjectId=1194487334
 spid18s,Unknown,resource-list
 spid18s,Unknown,Proc [Database Id = 5 Object Id = 711009614]
 spid18s,Unknown,inputbuf
 spid18s,Unknown,OrderNoRef = @OrderNoRef and ClientID = @ClientID and  OrderNo <> @OrderNo
 spid18s,Unknown,where
 spid18s,Unknown,select  Distinct OrderNoRef …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 deadlock

5
推荐指数
1
解决办法
924
查看次数

需要将单列分成多列

我的表有一个单列的数据:

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

我想要这样的输出:

1 2 3 4 5-first row
6 7 8 9 10 - second row
Run Code Online (Sandbox Code Playgroud)

另一个有两列这样的:

Column 1           Column 2
1                  a
2                  b
3                  c
4                  d
5                  e
6                  f
7                  g
8                  h
9                  i
10                 j
Run Code Online (Sandbox Code Playgroud)

我希望它显示如下:

1 a 2 b 3 c 4 d 5 e-first row
6 f 7 g 8 h 9 i 10 j - second row
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server

5
推荐指数
1
解决办法
8487
查看次数

BACKUP LOG 无法执行,因为当前没有数据库备份

我有一个使用完整恢复模型的 SQL Server 2005 数据库。如果我执行以下命令:

ALTER DATABASE test SET RECOVERY SIMPLE;
ALTER DATABASE test SET RECOVERY FULL;
Run Code Online (Sandbox Code Playgroud)

或者

BACKUP LOG test WITH  truncate_only;
Run Code Online (Sandbox Code Playgroud)

然后尝试运行日志备份:

BACKUP LOG test TO  DISK = 'backupfile.bak'
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

无法执行 BACKUP LOG,因为当前没有数据库备份。

问题

如何在不运行备份日志命令的情况下检查我是否无法进行日志备份?

sql-server-2005 sql-server backup transaction-log

5
推荐指数
2
解决办法
2330
查看次数

如何设计索引以加快删除速度

我想加快以下代码

delete from ssn_sdo
where       
           (art_id=@art_id and skl_id=@skl_id and @level=0 )
        or (art_id=@art_id and skl_id=@skl_id and @level=1 and tip=@tip)
        or (art_id=@art_id and skl_id=@skl_id and doc_id = @doc_id)
Run Code Online (Sandbox Code Playgroud)

我的服务器是 MS SQL-Server 2005。

art_idskl_iddoc_id是整数,而tip是varchar(10)类型。

我想在ssn_sdo表上创建一个索引,所以这个删除会更快。
我正在考虑做的是制作三个索引,每个索引都适用于每种情况:

doc_id (ASC), art_id (ASC), skl_id (ASC)  
skl_id (ASC), art_id (ASC), tip (ASC)  
skl_id (ASC), art_id (ASC),  
Run Code Online (Sandbox Code Playgroud)

或者有没有更好的方法来制作一个包含所有三种情况的索引。
我对索引很小心,因为我不想减慢此表中的插入速度。

performance sql-server-2005 database-design sql-server index-tuning

5
推荐指数
2
解决办法
407
查看次数