小编Que*_*CPO的帖子

识别未使用的存储过程

明年,我将帮助清理多个 SQL Server 环境。

我们有大约 10,000 个存储过程,估计其中只有大约 1000 个是定期使用的,另外还有 200 个左右是在极少数情况下使用的,这意味着我们有很多工作要做。

由于我们有多个部门和团队可以访问这些数据库和程序,因此我们并不总是调用这些程序的人,这意味着我们必须确定正在调用哪些程序。最重要的是,我们希望在几个月内而不是几天内确定这一点(这消除了一些可能性)。

一种方法是使用SQL Server Profiler并跟踪正在调用的过程,并将它们与我们拥有的过程列表进行比较,同时标记是否使用了这些过程。从那时起,我们可以将程序移动到不同的模式,以防部门尖叫。

Profiler在这里使用最有效的方法吗?和/或你们中有没有人做过类似的事情并找到了另一种方法/更好的方法来做到这一点?

sql-server profiler

25
推荐指数
3
解决办法
2万
查看次数

在 Powershell 中从 SSMS 检索打印的消息

我们的 DBA 团队不会使用以下方法验证备份TSQL(备份后可以轻松完成并且几乎不需要时间,所以我不明白为什么不这样做):

RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\LOCATION'
Run Code Online (Sandbox Code Playgroud)

他们过去曾遇到过问题,所以即使我们认为他们会从中吸取教训,但他们没有。我创建了一个 Powershell 脚本来执行此操作,因为我们有大约 100 多台服务器,我只想针对所有备份运行此脚本,以确保它们有效。下面的脚本运行正确(因为它不会中断或抛出错误),我很好奇是否有办法在 Powershell 中取回我们通常会在 SSMS 中获得的打印消息,其中说明文件 1 上的备份集是作为验证有效

$SqlCon = New-Object System.Data.SqlClient.SqlConnection
$SqlCon.ConnectionString = "SERVER=SERV\INST;Integrated Security=true;DATABASE=master"

$baks = Get-ChildItem "D:\Backups\" -Filter *.BAK

foreach ($bak in $baks)
{
    $SqlCon.Open()
    $cd = New-Object System.Data.SqlClient.SqlCommand
    $cd.Connection = $SqlCon

    $cd.CommandText = "RESTORE VERIFYONLY FROM DISK = @f"
    $cd.Parameters.Add("@f", $bak.FullName)
    $cd.ExecuteNonQuery()
    $SqlCon.Close()
}
Run Code Online (Sandbox Code Playgroud)

sql-server powershell

12
推荐指数
1
解决办法
7117
查看次数

按日期删除所有带有日期的表

在 SO 上参考这个问题,因为它很相似。

我正在研究一种从数据库中具有日期值的所有表中删除一系列日期的方法(用于构建迷你开发者)。我构建了一个脚本,允许用户传入开始、结束和数据库值,但我遇到了动态 sql 的问题。例如,在删除某些日期之间的记录时,我会遇到操作数冲突。下面显示了一个过度简化的例子:

DECLARE @b DATE, @e DATE, @cmd NVARCHAR(MAX)
SET @b = '2012-07-01'
SET @e = '2014-01-25'


SET @cmd = 'DELETE FROM DateTable
WHERE ValueDate BETWEEN ' + CONVERT(VARCHAR,@b,121) + ' AND ' + CONVERT(VARCHAR,@E,121)

EXEC sp_executesql @cmd
Run Code Online (Sandbox Code Playgroud)

错误是Operand type clash: date is incompatible with int。我尝试CAST在动态 sql 中做一个内部,因为错误表明ValueDate变成和INT

-- Only the WHERE clause changed:
WHERE ValueDate BETWEEN CAST(' + CONVERT(VARCHAR,@b,121) + ' AS DATE) AND CAST(' …
Run Code Online (Sandbox Code Playgroud)

sql-server

3
推荐指数
1
解决办法
2136
查看次数

比较两台服务器上的代理作业

我目前正在构建一个流程,Powershell在该流程中,我们SQL Server Agent只需输入服务器名称即可将作业从一台服务器复制到另一台服务器。该脚本使用 SMO 库来获取对两个作业服务器的访问权限,为“其他”服务器上不存在的作业编写脚本,然后运行这些脚本(在 SqlConnection 和 SqlCommand 下)。问题是如何检查ServerOneServerTwo.

我尝试了四种不同的方法:使用来自 ServerTwo(比较服务器)的作业构建一个数组,然后查看该数组是否是contains来自 ServerOne 的作业;我也尝试过类似逻辑的操作符;并且,使用数组,我在Compare-Object从两台服务器加载两个带有作业名称的数组并测量另一个不存在的作业(也产生所有内容)之后使用。最后,我遍历 ServerTwo 上的每个作业并遍历 ServerOne 上的每个作业,看看它们是否彼此相等(这是下面的代码)。这将产生一切,因为每个工作不等于每个工作:

$ServerName = "S1\I"
$ComServer = "S2\I"
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName
$com = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ComServer


foreach ($a in $com.JobServer.Jobs)
{
    $a = $a.Name.ToString() 
    foreach ($j in $srv.JobServer.Jobs) 
    { 
        $j = $j.Name.ToString()

        if ($a -like $j)
        {
            Write-Host $j
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法可以检查作业是否存在于一台服务器上与另一台服务器上(请注意,我已经知道如何编写作业脚本,执行它等等;确保作业不存在的部分已经存在是这里的问题)?

sql-server powershell

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

标签 统计

sql-server ×4

powershell ×2

profiler ×1