我需要一些帮助来找出以下T-SQL语句返回的原因1(true):
SELECT IIF( 0 = '', 1, 0)
Run Code Online (Sandbox Code Playgroud)
我猜有人改变了一个ANSI选项,比如SET ANSI_NULLS导致这种行为的其他东西。
我的问题是我加入了一些值,在最后一行集中我有由0和''值连接的值,这是不正确的。
我一直认为CONCAT函数实际上是+(字符串连接)的包装,并带有一些额外的检查,以使我们的生活更轻松。
我还没有找到任何关于这些功能是如何实现的内部细节。至于性能,当数据在循环中连接时,调用似乎会产生开销CONCAT(这似乎很正常,因为有额外的 NULL 句柄)。
几天前,一位开发人员修改了一些字符串连接代码(从+到 ,CONCAT)因为不喜欢语法并告诉我它变得更快。
为了检查情况,我使用了以下代码:
DECLARE @V1 NVARCHAR(MAX)
,@V2 NVARCHAR(MAX)
,@V3 NVARCHAR(MAX);
DECLARE @R NVARCHAR(MAX);
SELECT @V1 = REPLICATE(CAST('V1' AS NVARCHAR(MAX)), 50000000)
,@V2 = REPLICATE(CAST('V2' AS NVARCHAR(MAX)), 50000000)
,@V3 = REPLICATE(CAST('V3' AS NVARCHAR(MAX)), 50000000);
Run Code Online (Sandbox Code Playgroud)
这是变体一:
SELECT @R = CAST('' AS NVARCHAR(MAX)) + '{some small text}' + ISNULL(@V1, '{}') + ISNULL(@V2, '{}') + ISNULL(@V3, '{}');
SELECT LEN(@R); -- 1200000017
Run Code Online (Sandbox Code Playgroud)
这是变体二:
SELECT @R = CONCAT('{some small text}',ISNULL(@V1, '{}'), ISNULL(@V2, …Run Code Online (Sandbox Code Playgroud) 我们正在使用AlwaysOn Availability GroupSQL Server 2012 的功能。每天都会在辅助数据库上进行定期的完整数据库备份和事务日志备份。
我在这里读到在主副本或辅助副本上执行事务日志备份会将两个副本的事务日志标记为可重用。无论如何,事务日志备份大小很大,可以使用收缩文件来减少:

我已经在本地恢复了数据库并执行了收缩操作。日志文件大小减少到 160 MB。
我的问题是我应该在哪个数据库上对事务日志文件(主要、次要或两者)执行收缩操作?
我猜过去几年没有备份日志文件,所以它变得如此庞大。执行DBCC SQLPERF (LOGSPACE)我可以看到只0.06%使用了文件 - 我没有必要保留这么大的日志文件。在[sys].[database_files]我检查其max_size设置为-1与growth对65536,所以我想,当它需要更多的空间,它会得到。无论如何,我可以将其缩小到例如 5% 以防止未来的增长。我试图找到一些确认,我这样做不是坏主意。
实际上,备份(对数据库和日志文件)仅在辅助数据库上执行,因此对它们执行收缩文件会更容易,但是主日志文件的大小也会减小吗?
我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,压缩row和page压缩没有预期的影响(对于 20 GB 表仅节省了大约 100/200 MB)。此外,我无法应用列存储和列存储归档压缩,因为它们不支持NVARCHAR(MAX)字段压缩。
谁能告诉我这里是否有其他选择?
我也猜测row和page压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。
我发现以下查询可以按数据库检测 CPU 使用率,但它们显示不同的结果:
WITH DB_CPU_Stats
AS
(
SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName],
SUM(total_worker_time) AS [CPU_Time_Ms]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY (
SELECT CONVERT(int, value) AS [DatabaseID]
FROM sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE attribute = N'dbid') AS F_DB
GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
DatabaseName,
[CPU_Time_Ms],
CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
--WHERE DatabaseID > 4 -- system databases
--AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num …Run Code Online (Sandbox Code Playgroud) 我有一个包含 42 列的表和一个触发器,当这些列中的 38 列更新时,它应该做一些事情。因此,如果其余 4 列发生更改,我需要跳过逻辑。
我可以使用UPDATE()函数并创建一个大IF条件,但更喜欢做一些更短的事情。使用COLUMNS_UPDATED我可以检查是否所有某些列都更新了?
例如,检查第 3、5 和 9 列是否更新:
IF
(
(SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20)
AND
(SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1)
)
PRINT 'Columns 3, 5 and 9 updated';
Run Code Online (Sandbox Code Playgroud)
因此,20列3和的5值,以及1列的值,9因为它设置在第二个字节的第一位。如果我将语句更改为OR它会检查列3和/5或列9是否更新?
如何OR在一个字节的上下文中应用逻辑?
我将创建一个包含两个字段的表 - IDasBIGINT和IPAddressasvarchar(45)或者varbinary(16)。这个想法是存储所有唯一的 IP 地址并使用引用ID而不是IP address其他表中的实际地址。
通常,我将创建一个存储过程,该过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID.
我期望有很多记录(我无法确切说出有多少),但我需要尽快执行上面的存储过程。所以,我想知道如何以文本或字节格式存储实际的 IP 地址。哪个会更好?
我已经编写了SQL CLR用于将 IP 地址字节转换为字符串和反向转换的函数,因此转换不是问题(同时使用IPv4和IPv6)。
我想我需要创建一个索引来优化搜索,但我不确定我应该将该IP address字段包含在聚集索引中,还是创建一个单独的索引以及使用哪种类型的搜索会更快?
database-design sql-server sql-server-2012 sql-clr nonclustered-index
在 SQL Server 2019 中,Microsoft 引入了对和数据类型的UTF-8 支持,并表示:CHARVARCHAR
此功能可显着节省存储空间,具体取决于使用的字符集。例如,使用支持 UTF-8 的归类将带有 ASCII 字符串的现有列数据类型从 NCHAR(10) 更改为 CHAR(10),意味着存储需求减少了近 50%。这种减少是因为 NCHAR(10) 需要 22 个字节的存储空间,而 CHAR(10) 需要 12 个字节来存储相同的 Unicode 字符串。
UTF-8似乎支持每个脚本,所以基本上我们就可以开始在存储Unicode数据varchar和char列。正如文档中所说,这可以减少表和索引的大小,从那里我们可以获得更好的性能,因为读取的数据量更少。
我想知道这是不是意味着我们可以停止使用nvarchar和nchar列,它实现UTF-16?
任何人都可以指出一个场景和原因,不要使用带有UTF编码的 char 数据类型并继续使用 n-chars数据类型吗?
我知道当使用VARCHAR(MAX)/NVARCHAR(MAX)列时,数据被存储out of the row- 数据行将有一个指向存储“大值”的另一个位置的指针。
我有以下问题:
out of the row还是仅存储这些字段max?clustered index表的 来读取整个记录,那么存储在行外的字段是否也被读取?VARCHAR(MAX) 或 NVARCHAR(MAX) 被视为“大值类型”。大值类型通常存储在“行外”。这意味着...
我有:
我正在使用以下语句使我的表成为临时表:
ALTER TABLE [dbo].[AnalysisCustomRollupsV2JoinGroups]
ADD [SysStartTime] DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT DF_AnalysisCustomRollupsV2JoinGroups_SysStart DEFAULT GETUTCDATE()
,[SysEndTime] DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DF_AnalysisCustomRollupsV2JoinGroups_SysEnd DEFAULT CONVERT(DATETIME2(0), '9999-12-31 23:59:59'),
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]);
ALTER TABLE [dbo].[AnalysisCustomRollupsV2JoinGroups]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.AnalysisCustomRollupsV2JoinGroupsChanges));
Run Code Online (Sandbox Code Playgroud)
问题:
在我的本地 SQL 实例上,我有很多数据库;查询在其中一些上成功运行非常奇怪,而在其中一些上它给了我以下错误:
消息 13542,级别 16,状态 0,第 51 行 ADD PERIOD FOR SYSTEM_TIME 在表 'dbo.AnalysisCustomRollupsV2JoinGroups' 上失败,因为有打开的记录,期间的开始时间设置为将来的某个值。
有时,当我调试/执行查询时,初始查询运行成功。
我读到,这可能是因为我在表中有现有数据。所以,我改变了这样的逻辑:
再说一次,在某些数据库上它是可以的,而在其他数据库上则不是。试图解决这个问题,我 …
sql-server ×9
t-sql ×4
compression ×1
concat ×1
datatypes ×1
performance ×1
shrink ×1
sql-clr ×1
trigger ×1
unicode ×1
utf-8 ×1
varchar ×1