按照我之前的问题:隐式转换不会影响性能
我使用了下面的简单查询
select count(*)
from fpc
where SKey in ('201701', '201702A')
Run Code Online (Sandbox Code Playgroud)
SKey 是 int 类型,我在它上面有非聚集列存储索引。
显然我无法运行它,因为第二个值不是数字。所以我按 Ctrl+L 来查看估计的执行计划,我在Predicate属性中看到了一个有趣的事情:
[mydb].[dbo].[fpc].[SKey]=CONVERT_IMPLICIT(int,'201702A',0) OR
[mydb].[dbo].[fpc].[SKey]=(201701)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么 SQL 使用“201701”作为数字,但对第二个值使用隐式转换:“201702A”
我感兴趣的是 SQL 服务器如何查看这两个值的内部机制。它知道第一个是数字而第二个不是吗?
任何想法,为什么以下查询中的第一个返回带有 -1,NULL 的行,尽管它有一个WHERE 1=2?
只有当我将查询放入另一个子查询时,它才能正常工作(并返回一个空的结果集)。
在 Microsoft SQL Server 2014 和 2016 上测试
DECLARE @i INT = 1
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
WHERE 1 = 2
SELECT s1.i, s1.mid
FROM (
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
) …Run Code Online (Sandbox Code Playgroud) 我有一段时间试图将FLOAT(53)字段转换VARCHAR为没有尾随零或科学记数法的字段。
该字段可能有一个非常大或非常小的数字。我需要将其转换为 VARCHAR 并最多显示小数点后 5 位但没有尾随零。所以 123.456789 应该是 123.45678,123456.78 应该是 123456.78。
我有一个 SQL Fiddle 显示我尝试过的内容:http ://sqlfiddle.com/#!6/bd392/4
我已经安装了 VS 2017。之后我安装了 SQL Server 2014。
每当我使用 SSMS 创建数据库并尝试创建表时,它都会返回以下错误:
不支持此后端版本来设计数据库图表或表格。(MS 可视化数据库工具)。
使用 SSMS 创建数据库时,兼容性级别没有可供选择的值。
SQL Server 的版本是 2017,SSMS 的版本是 2014。我该如何解决?
有什么方法可以将 SQL Server 2017 与 SSMS 2014 一起使用?
我正在使用BrentOzar的SQL Server First Responder Kit,因为我属于“管理 Microsoft SQL Server 的开发人员。如果它们出现故障或缓慢是您的错”。
运行的警告之一sp_blitz如下:
[DB] 数据库文件 DB_log 的最大文件大小设置为 10240MB。如果空间不足,即使可能有可用的驱动器空间,数据库也会停止工作。
日志文件位于与操作系统不同的驱动器上,我确实限制了它们的增长。所有数据库都有简单的恢复模式(大部分数据是通过复制和ETL自动获取的,从上次备份中恢复对我来说就足够了)。
该数据库有大约 20GB 的数据。
问题:如果恢复模式不强制我备份日志,数据库如何停止工作?
在像某些情况下这一个,SQL Server将默默地截断(N)VARCHAR值,导致严重的数据丢失时,错误地声明变量。
问题:可以将 SQL Server 配置为不以静默方式截断 VARCHAR 值吗?(并发出错误/引发异常)
我有 TBV 功能。像这样
ALTER FUNCTION [dbo].[fn_Functiont]
(
@accessibleIds ListAccesableIds READONLY
)
RETURNS TABLE
AS
RETURN
(
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud)
我想传递给这个包含整数的函数列表。我想创建表值类型,但这里的问题是我如何将 List 输入参数传递给函数?我知道我可以通过 …
sql-server entity-framework functions sql-server-2014 table-valued-parameters
SQL SERVER 2014 - 有没有办法知道上次执行触发器的时间?
我在我的服务器上创建了一个登录名和一个数据库用户,如下所示:
USE master
GO
CREATE LOGIN MyLogin WITH PASSWORD=N'Password123!'
GO
USE AdventureWorks2014
GO
CREATE USER MyLogin FOR LOGIN MyLogin
GO
ALTER USER MyLogin WITH DEFAULT_SCHEMA=HumanResources
GO
GRANT SELECT ON SCHEMA :: Production TO MyLogin
GO
GRANT SELECT ON SCHEMA :: HumanResources TO MyLogin
GO
GRANT SELECT ON SCHEMA :: dbo TO MyLogin
Run Code Online (Sandbox Code Playgroud)
当我作为 MyLogin 登录时,我现在可以在 HumanResources 模式中选择对象而不使用四部分名称(因为 HumanResources 是该用户的默认模式)
SELECT * FROM HumanResources.Department
Run Code Online (Sandbox Code Playgroud)
现在可以在没有架构名称的情况下运行:
SELECT * FROM Department
Run Code Online (Sandbox Code Playgroud)
这可以。如果我然后尝试从生产模式中的表中选择而不使用模式前缀:
SELECT * FROM ProductDescription
Run Code Online (Sandbox Code Playgroud)
我按预期收到错误。这可以通过使用以下方法解决:
SELECT * FROM Production.ProductDescription
Run Code Online (Sandbox Code Playgroud)
因此,基于此,我需要在从默认架构之外的任何表中进行选择时指定架构名称。
那么为什么当我从 …
我试图找到导致数据库的 mdf 从 20 GB 膨胀到 100 GB 的原因。
到目前为止,我尝试检查自动增长事件以找到时间,但使用标准报告甚至默认跟踪文件都找不到。
我们没有 3rd 方监控工具来确认是否有任何维护工作(如重建)或任何其他过程。
我怎样才能找到导致这个 mdf 增长的原因?
sql-server ×10
sql-server-2014 ×10
auto-growth ×1
cast ×1
functions ×1
permissions ×1
schema ×1
sp-blitz ×1
t-sql ×1
trigger ×1
varchar ×1