几年前我读到软删除会提高删除的性能,因为它不会实际删除项目并影响聚集(和所有其他)索引,它只会改变一个值。
我最近尝试了这个,但我的表现非常令人失望。
所以我在网上搜索了一个很好的软删除实现,我最终阅读的第一件事是文章/博客说“软删除是不好的”。
显然,当桌子变大时,它弊大于利......
我不认为我所做的会使表格变得更大,因为每晚(每天)的维护都会删除(真正的)所有标记为删除的行。
那么,软删除真的不利于性能吗?真正的删除是否会导致整个聚簇表完全重新排序(这将是很多磁盘操作!!!)?
performance database-design sql-server delete sql-server-2008-r2
我正在对 SQL Server 中的约束进行审计。
如何找到所有未启用的约束?
在使用下一个声明之后:
alter table mytable nocheck constraint all
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2008 R2。如果正在执行数据库备份(完整/差异/事务日志)并且突然断电或系统崩溃,会发生什么情况?这会损坏备份集吗?
如果是这样,那么有哪些可用选项,以便在需要进行数据库还原时以及何时完成我不会以损坏的备份集结束。
如果不是,那么正在进行的备份的状态是什么?
sys.tables 列出单个数据库中的所有用户表,但没有它们的架构名称。
如果我在创建代码时知道现有数据库,我可以使用它USE来浏览所有数据库,查询sys.tables其表,并将列表插入到临时表中以供以后使用。
但是,有没有更简单的方法来做到这一点,并且通过唯一的查询能够从所有用户数据库中检索所有用户表及其架构?
我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“X”),直到您将鼠标悬停在它们上面。我一遍又一遍地尝试重写搜索词,但我想我不知道该问什么,所以如果已经回答了这个问题,我深表歉意。
我试图弄清楚如何将一个 INT 列添加到一个表中,该列从 1 开始并根据另一个列值(我们称之为case_id)递增(我们称此字段版本),如果该值与先前迭代的行 - 如果它不相同,则版本值应重置为 1。
我试图通过更新我创建的临时表或在 SELECT INTO 语句期间添加值来解决这个问题。
此表的目的是存储案例的历史更新记录,由case_id列标识,此版本值与修改时间戳的顺序相同。
将此表结构视为源数据的示例:
---------------------------------
| case_id | modify_time |
---------------------------------
| 1 | 2015-05-01 11:12:13 |
| 1 | 2015-05-02 12:13:14 |
| 1 | 2015-05-03 13:14:15 |
| 2 | 2015-05-01 11:12:13 |
| 2 | 2015-05-01 12:13:14 |
| 3 | 2015-05-02 11:12:13 |
---------------------------------
Run Code Online (Sandbox Code Playgroud)
将此作为我想要实现的最终结果的示例:
-------------------------------------------
| case_id | modify_time | version |
-------------------------------------------
| 1 | …Run Code Online (Sandbox Code Playgroud) 我正在使用扩展事件来跟踪服务器上正在执行的过程及其执行程序的主机名。
我使用了以下 XE 脚本:
CREATE EVENT SESSION [EXEC_SP] ON SERVER
ADD EVENT sqlserver.sp_statement_completed
(
SET collect_statement=(0)
ACTION
(
sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,
sqlserver.nt_username,sqlserver.server_instance_name,
sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,
sqlserver.transaction_id,sqlserver.username
)
WHERE ( [sqlserver].[is_system]=(0))
)
ADD TARGET package0.asynchronous_file_target
(
SET FILENAME = N'C:\EXEC_SP.xel',
METADATAFILE = N'C:\EXEC_SP.xem'
)
WITH
(
MAX_MEMORY=4096KB,
EVENT_RETENTION_MODE=NO_EVENT_LOSS,
MAX_DISPATCH_LATENCY=15 SECONDS,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
);
Run Code Online (Sandbox Code Playgroud)
但是,正在执行的过程主体内的每个语句都在目标处构成一行。
例如,如果我的程序主体中有 5 个语句,则该事件将被触发 5 次,并且在目标处将有 5 个不同的条目对应于相同的条目。
我只为每个正在执行的过程寻找一个条目,而不是多个条目。
也就是说,正在执行的每个过程都应该只构成 1 行而不是多行。
如何解决这个问题?
SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?
这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。
在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。
由Select.
SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId) + ', '
+ Convert(varchar(6), @ROIResultId) + ', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + ', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + '; '
FROM @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId
Run Code Online (Sandbox Code Playgroud)
结果
是否连接结果并调用Exec?
我有以下脚本,运行时给我一个逗号分隔的数据库名称列表。
SET NOCOUNT ON
declare @db_list NVARCHAR(MAX)
DECLARE @command varchar(1000)
SELECT @COMMAND = 'SELECT DB_NAME()'
SELECT @db_list = STUFF((
SELECT ', ' + name FROM sys.databases
WHERE name like '__Order'
FOR XML PATH(''),
TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
-- in case there are no DBs to show, then show no DB '***'
select @db_list = COALESCE(@db_list,'***')
SELECT @db_list = RTRIM(LTRIM(REPLACE(@DB_LIST,',', ',''')))
select @db_list
Run Code Online (Sandbox Code Playgroud)
这给了我以下结果:
UKOrder,' ATOrder,' AUOrder
Run Code Online (Sandbox Code Playgroud)
1)这给出了错误的结果集,我希望它是
'UKOrder','ATOrder','AUOrder'
Run Code Online (Sandbox Code Playgroud)
2) 如何将@db_list 传递给 sp_MSforeachdb?
假设我想跑
选择 db_name()
在@db_list 中的每个数据库中
英国订单
订单 …
sql-server dynamic-sql sql-server-2008-r2 sql-server-2012 sql-server-2014
我们已经运行 SQL Server 2014 将近一年了,但 SQL Server 2012 SP3 继续出现在 Windows 更新列表中(作为可选安装)。从以前的版本安装服务包似乎很荒谬,所以我只是忽略了它。
但是,我们最近开始遇到断言失败(有关更多信息,请参见下文),我们正在尝试解决的一件事是确保服务器已完全修补。我们安装了 2014 年最新的累积更新,但它没有解决问题或使 SP3 项目从 Windows 更新中消失。SP3 仍然不在我的关注范围内,但后来我发现了一篇Microsoft 产品支持服务博客文章,其中说使用最佳实践安全分析器来尝试解决断言失败,当我这样做时,它提出了一个警告,我们没有应用那个SP3。
所以现在我正在考虑应用该安装,但我担心我会不小心降级我的服务器 - 不是我们会完全回到 2012 年,而是一些累积更新可能会被还原,或者其他一些奇怪的行为。
(这不是我们收到的确切断言失败,但它很接近。我找不到似乎描述我们遇到的实际问题的知识库文章 - 上一句中链接的知识库与TOP N我们的有关与使用 的过程有关OFFSET X ROWS FETCH NEXT Y ROWS ONLY。实际的断言失败是SQL Server Assertion: File: <op_ppqte.cpp>, line=12258)
sql-server installation sql-server-2012 service-pack sql-server-2014
我想DDMMYYY从以格式存储日期的字段中获取格式的日期YYYY-MM-DD Timestamp。(例如,“2018-11-09”应显示“09Nov2018”)。
我知道一种方法是使用可以提取的datepart函数(https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql?view=sql-server-2017)单独的年、月和日,然后我可以连接它们。
编辑:我不想使用getdate(). 有一列具有YYYY-MM-DD Timestamp格式,我正在从该列中提取'DDMM2018'. 我在用:
concat
(
CONVERT(varchar, DATEPART(dd,columndate)),
CONVERT(varchar, LEFT(DATENAME(month, DATEPART(month,columndate)),3)) ,
CONVERT(varchar, DATEPART(year, columndate))
) AS trial
Run Code Online (Sandbox Code Playgroud)
这给了我'9Nov2018'而不是'09Nov2018'。我打算再次将其转换回`datetype',因为这就是我想要的结果。
有没有其他方法可以实现这一目标?
任何想法/建议非常感谢。
sql-server ×10
alter-table ×2
dynamic-sql ×2
t-sql ×2
backup ×1
constraint ×1
ddl ×1
delete ×1
installation ×1
performance ×1
service-pack ×1
update ×1