小编Han*_*non的帖子

重新启动主动节点服务而不进行故障转移

在 2 节点 Windows Server 故障转移群集配置中,如何重新启动 SQL Server 服务而不故障转移到其他节点?

windows clustering failover high-availability

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

如何避免在“匹配时更新”子句中重复相同的条件?

我想将一张表合并到另一张表中。我需要在我的 WHEN MATCHED 子句中应用条件逻辑,理想情况下这样做:

MERGE INTO ATable AS a
USING BTable AS b
ON a.ID = b.ID
WHEN NOT MATCHED THEN
-- Do insert
WHEN MATCHED AND b.NeedsAdjustment = 1 THEN
UPDATE SET
    Col1 = b.Col1 + b.Adjustment
    ,Col2 = b.Col2 + b.Adjustment
    ,Col3 = b.Col3 + b.Adjustment
WHEN MATCHED THEN -- Default case (b.NeedsAdjustment <> 1)
UPDATE SET
    Col1 = b.Col1
    ,Col2 = b.Col2
    ,Col3 = b.Col3
Run Code Online (Sandbox Code Playgroud)

这不是有效的 SQL。根据 MSDN 文档:

如果有两个 WHEN MATCHED 子句,则一个必须指定 UPDATE 操作,一个必须指定 DELETE 操作。 …

sql-server update merge

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

为什么请求 sp_delete_job 的“估计执行计划”会抛出错误?

我正在尝试查看以下 T-SQL 语句的估计执行计划:

EXEC msdb.dbo.sp_delete_job @job_id = '3A015189-F4EB-439B-9CA0-27AFB74719D8'
    , @originating_server = '(LOCAL)'
    , @delete_history = 0
    , @delete_unused_schedule = 0;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,SQL Server 抛出以下错误:

消息 213,级别 16,状态 1,过程 sp_delete_all_msx_jobs,第 25 行

列名或提供的值数量与表定义不匹配。

的定义sp_delete_all_msx_jobs包含以下相关行,从第 25 行开始(为了可读性而包装):

INSERT INTO #temp_jobs_to_delete
SELECT sjv.job_id, 
    CASE sjs.server_id WHEN 0 THEN 1 ELSE 0 END,
    sjv.owner_sid
FROM msdb.dbo.sysjobs_view sjv
    LEFT OUTER JOIN msdb.dbo.sysjobservers sjs 
        ON (sjv.job_id = sjs.job_id)
WHERE (ISNULL(sjs.server_id, 0) = 0)
    AND (sjv.originating_server = @msx_server)
Run Code Online (Sandbox Code Playgroud)

该存储过程的第 14 行显示了#temp_jobs_to_deleteis的定义:

CREATE TABLE #temp_jobs_to_delete …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-agent

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

一个打开的事务回滚的所有方式是什么?

当一个事务在 SQL Server 中打开时,它可以回滚的所有方式是什么?我们目前正在使用一个 3rd 方应用程序,该应用程序经常在查询处于睡眠状态时显示打开的事务,有时会持续数天(通过 sp_WhoIsActive 显示)。这使我相信应用程序中某处存在错误,不允许提交事务。这些事务可能回滚的所有方式是什么?

  1. 客户端超时(如果指定)
  2. 客户端关闭或重新启动应用程序
  3. 手动终止 SPID
  4. 还要别的吗?

我应该对已经打开数小时或数天的交易做些什么吗?如果他们无论如何都要回滚或超时,那么终止进程有什么害处吗?

sql-server transaction rollback connectivity

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

一个位置的最小距离;一个点表与一组点 SQL 2012 相比

我试图找到找到一个点到点表的最小距离的最快方法。唯一需要注意的是,我试图找到最小距离的点表是 150K 单点。

或者更好地解释表 A 有 150K 行/点,表 B 1500 点。我想知道表 A 中的每一行与表 B 中列出的所有行的最小距离是多少。

我有一个进行距离计算的函数,作为表 A 的附加列。它只需要很长时间。表 B 有一个空间索引。

这就是我所拥有的:

select a.*, 
       dbo.fxn_distance(geography::STPointFromText('POINT(' + 
       CAST([Long] AS VARCHAR(20)) + ' ' + CAST([Lat] AS 
       VARCHAR(20)) +    ')', 4326)) as DistAway
from Table A a
Run Code Online (Sandbox Code Playgroud)

我的功能:

create function fxn_distance
(@pointTableA geography
)
returns float 
as 
begin

declare @distance float

select top 1 @distance = b.GeoLocation.STDistance(@pointTableA) 
from TableB b  
where geolocation.STDistance(@pointTableA) is not null
order by geolocation.STDistance(@pointTableA)

return @distance
end
Run Code Online (Sandbox Code Playgroud)

对不起,如果我完全是一个新手,我知道解决方案可能很简单,但我无法解决这个问题。所以希望澄清一下:我需要通过表 A …

sql-server t-sql sql-server-2012 spatial

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

RIGHT() 在 SELECT 中有效但在 UPDATE 中无效?

我正在尝试运行一个脚本,该脚本执行一些工作,包括从列的每一行内的字符串中去除前导两个字符。为此,我正在使用RIGHT()它,当我在 a 中使用它时它工作正常,SELECT..FROM但是当我在 a 中使用相同的代码时UPDATE它失败了

传递给 RIGHT 函数的长度参数无效

为什么它失败了UPDATE但不是SELECT...FROM

USE JobSight;

DROP TABLE #ReleaseTemp;


SELECT  A.MajRelease,  
        A.MinRelease,
        A.Build,
        Split.a.value('.', 'VARCHAR(MAX)') AS ReleaseNotes
INTO #ReleaseTemp
FROM  
        (
            SELECT  MajRelease,
                    MinRelease,
                    Build,  
                    CAST ('<M>' + REPLACE(RelNotes, ';;', '</M><M>') + '</M>' AS XML) AS ReleaseNotes
            FROM JobsDB.dbo.ReleaseData
        ) AS A 
    CROSS APPLY ReleaseNotes.nodes ('/M') AS Split(a);

UPDATE #ReleaseTemp
SET ReleaseNotes = RIGHT(ReleaseNotes, LEN(ReleaseNotes) - 2);

UPDATE #ReleaseTemp
SET ReleaseNotes = LTRIM(#ReleaseTemp.ReleaseNotes);

SELECT  MajRelease, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

在 case 子句中使用默认值更新

我有一张像

CREATE TABLE Mytable (ID int identity, Name nvarchar(10)); 
GO 
INSERT INTO MyTable (Name) VALUES ('test1'); 
INSERT INTO MyTable (Name) VALUES ('test2'); 
GO 
ALTER TABLE MyTable ADD CONSTRAINT DF_Name DEFAULT('test') FOR Name;
Run Code Online (Sandbox Code Playgroud)

现在我想像这样更新我的 Name 列:

Update MyTable
set name = case ID when 1 then DEFAULT END;
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

关键字“DEFAULT”附近的语法不正确

如何在子句中使用UPDATEwithDEFAULT语句CASE

sql-server sql-server-2014

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

一次性将所有代理作业的 SQL 代理输出添加到文本文件中

作为最佳实践,我正在尝试安排一个活动,其中所有 SQL 代理作业都应将输出记录到文本文件中。

手动我可以为单个工作执行此操作。但是我正在通过脚本或任何好的方法寻找更好的方法,我可以为每个服务器大约 80-90 个作业的多个作业进行此更改。

此外,我必须在 QA、UAT 和 prod 中执行此操作,涵盖 100 多台服务器。

请分享您的经验或任何有用的链接,这是如何以最佳方式实现的,因为生成输出的日志文件的路径应该在服务器/作业之间通用。

sql-server sql-server-2012 sql-server-agent jobs

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

恢复事务日志时出错

我正在尝试恢复数据库日志,但是我收到以下消息:

消息 4305,级别 16,状态 1,第 3 行
此备份集中的日志从 LSN 76120000013549400001 开始,它太新,无法应用于数据库。可以还原包含 LSN 75428000036693300001 的早期日志备份。
消息 3013,级别 16,状态 1,第 3 行
RESTORE LOG 异常终止。

什么是 LSN?

如何确定哪个备份包含正确的 LSN?

sql-server sql-server-2012 transaction-log

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

加密存储过程正在加密计划缓存查询计划

在查询与存储过程加密相关的计划缓存时,我遇到了一个非常奇怪的问题。但是,查询加密计划缓存的是存储过程,而不是计划缓存本身中的查询。让我解释...

下面的过程只是在计划缓存中搜索匹配的字符串并输出查询计划(最后一列)。

    ALTER PROCEDURE spQueryPlanCache @textstring nvarchar(max)
    AS
    BEGIN
        SELECT 
                databases.name,
            dm_exec_sql_text.text AS TSQL_Text,
            dm_exec_query_stats.creation_time, 
            dm_exec_query_stats.execution_count,
            dm_exec_query_stats.total_worker_time AS total_cpu_time,
            dm_exec_query_stats.total_elapsed_time, 
            dm_exec_query_stats.total_logical_reads, 
            dm_exec_query_stats.total_physical_reads, 
            dm_exec_query_plan.query_plan
        FROM sys.dm_exec_query_stats 
        CROSS APPLY sys.dm_exec_sql_text(dm_exec_query_stats.plan_handle)
        CROSS APPLY sys.dm_exec_query_plan(dm_exec_query_stats.plan_handle)
        INNER JOIN sys.databases
        ON dm_exec_sql_text.dbid = databases.database_id
        WHERE dm_exec_sql_text.text LIKE @textstring
        
    END
Run Code Online (Sandbox Code Playgroud)

这是最后一列中输出的计划 XML 的示例:

    ALTER PROCEDURE spQueryPlanCache @textstring nvarchar(max)
    AS
    BEGIN
        SELECT 
                databases.name,
            dm_exec_sql_text.text AS TSQL_Text,
            dm_exec_query_stats.creation_time, 
            dm_exec_query_stats.execution_count,
            dm_exec_query_stats.total_worker_time AS total_cpu_time,
            dm_exec_query_stats.total_elapsed_time, 
            dm_exec_query_stats.total_logical_reads, 
            dm_exec_query_stats.total_physical_reads, 
            dm_exec_query_plan.query_plan
        FROM sys.dm_exec_query_stats 
        CROSS APPLY sys.dm_exec_sql_text(dm_exec_query_stats.plan_handle)
        CROSS APPLY sys.dm_exec_query_plan(dm_exec_query_stats.plan_handle)
        INNER JOIN sys.databases …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures encryption

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