在 2 节点 Windows Server 故障转移群集配置中,如何重新启动 SQL Server 服务而不故障转移到其他节点?
我想将一张表合并到另一张表中。我需要在我的 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 操作。 …
我正在尝试查看以下 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 中打开时,它可以回滚的所有方式是什么?我们目前正在使用一个 3rd 方应用程序,该应用程序经常在查询处于睡眠状态时显示打开的事务,有时会持续数天(通过 sp_WhoIsActive 显示)。这使我相信应用程序中某处存在错误,不允许提交事务。这些事务可能回滚的所有方式是什么?
我应该对已经打开数小时或数天的交易做些什么吗?如果他们无论如何都要回滚或超时,那么终止进程有什么害处吗?
我试图找到找到一个点到点表的最小距离的最快方法。唯一需要注意的是,我试图找到最小距离的点表是 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 …
我正在尝试运行一个脚本,该脚本执行一些工作,包括从列的每一行内的字符串中去除前导两个字符。为此,我正在使用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) 我有一张像
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 代理作业都应将输出记录到文本文件中。
手动我可以为单个工作执行此操作。但是我正在通过脚本或任何好的方法寻找更好的方法,我可以为每个服务器大约 80-90 个作业的多个作业进行此更改。
此外,我必须在 QA、UAT 和 prod 中执行此操作,涵盖 100 多台服务器。
请分享您的经验或任何有用的链接,这是如何以最佳方式实现的,因为生成输出的日志文件的路径应该在服务器/作业之间通用。
我正在尝试恢复数据库日志,但是我收到以下消息:
消息 4305,级别 16,状态 1,第 3 行
此备份集中的日志从 LSN 76120000013549400001 开始,它太新,无法应用于数据库。可以还原包含 LSN 75428000036693300001 的早期日志备份。
消息 3013,级别 16,状态 1,第 3 行
RESTORE LOG 异常终止。
什么是 LSN?
如何确定哪个备份包含正确的 LSN?
在查询与存储过程加密相关的计划缓存时,我遇到了一个非常奇怪的问题。但是,查询加密计划缓存的是存储过程,而不是计划缓存本身中的查询。让我解释...
下面的过程只是在计划缓存中搜索匹配的字符串并输出查询计划(最后一列)。
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 ×9
t-sql ×2
clustering ×1
connectivity ×1
encryption ×1
failover ×1
jobs ×1
merge ×1
rollback ×1
spatial ×1
transaction ×1
update ×1
windows ×1