标签: sql-server

写 varchar 和 nvarchar 之间的区别

目前在我们的 SQL Server 2012 数据库中,我们正在使用varchar,我们想改变它nvarchar。我已经生成了一个脚本来做到这一点。

我的问题是 SQL Server 写入varchar列的方式与写入列的方式有什么不同吗?nvarchar列的吗?我们有一些我很关心的后端程序。

编辑:
不确定这是否有帮助,但这些列没有索引、f/k 或约束。

sql-server varchar

65
推荐指数
3
解决办法
25万
查看次数

将数组参数传递给存储过程

我有一个进程可以抓取一堆记录(1000 条)并对它们进行操作,当我完成后,我需要将其中的大量记录标记为已处理。我可以用一个大的 ID 列表来表明这一点。我试图避免“循环更新”模式,所以我想找到一种更有效的方法来将这个 ID 包发送到 MS SQL Server 2008 存储过程中。

提案#1 - 表值参数。我可以定义一个只有一个 ID 字段的表类型,然后发送一个包含要更新的 ID 的表。

建议 #2 - XML 参数 (varchar) 和 OPENXML() 在 proc 主体中。

建议 #3 - 列表解析。如果可能的话,我宁愿避免这种情况,因为它看起来笨拙且容易出错。

其中有什么偏好,或者我错过了什么想法?

sql-server-2008 sql-server

63
推荐指数
7
解决办法
27万
查看次数

连接和会话有什么区别?

连接和会话之间有什么区别以及它们之间的关系?

sql-server

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

SQL Server 中的“记录”和“行”有什么区别?

有一个关于在 SQL Server添加日期和时间的无关紧要的问题引发了一场相当引人入胜的分类辩论。

那么我们如何区分这些相关术语以及如何正确使用它们呢?

记录

sql-server terminology row record

62
推荐指数
8
解决办法
3万
查看次数

默认情况下,我可以从 SQL Server 获取哪些事件信息?

我经常看到这样的问题,人们想知道某件事是否发生、何时发生或是谁执行的。在很多情况下,SQL Server 不会自行跟踪此信息。例如:

  • 谁最后执行了存储过程dbo.MyProcedure
  • 谁更新salarydbo.Employees表中的列?
  • 谁最后dbo.Orders从 Management Studio查询了表?

但是,SQL Server默认临时跟踪其他几个事件,并且可以在本机回答有关问题,例如:

  • AdventureWorks 数据库中上一次自动增长是什么时候?用了多长时间?
  • 谁删除了dbo.EmployeeAuditData表,何时删除?
  • 今天发生了多少与内存相关的错误?

我如何获得这些信息,以及它可以保持多久?

sql-server extended-events

61
推荐指数
1
解决办法
2万
查看次数

我应该什么时候重建索引?

我应该什么时候重建我的关系数据库 (SQL Server) 中的索引?

是否有定期重建索引的情况?

sql-server index-maintenance

60
推荐指数
5
解决办法
9万
查看次数

使用窗口函数的日期范围滚动总和

我需要计算一个日期范围内的滚动总和。为了说明,使用AdventureWorks 示例数据库,以下假设语法将完全满足我的需要:

SELECT
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 = SUM(TH.ActualCost) OVER (
        PARTITION BY TH.ProductID
        ORDER BY TH.TransactionDate
        RANGE BETWEEN 
            INTERVAL 45 DAY PRECEDING
            AND CURRENT ROW)
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate,
    TH.ReferenceOrderID;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,RANGE窗口框架范围目前在 SQL Server 中不允许间隔。

我知道我可以使用子查询和常规(非窗口)聚合编写解决方案:

SELECT 
    TH.ProductID,
    TH.TransactionDate,
    TH.ActualCost,
    RollingSum45 =
    (
        SELECT SUM(TH2.ActualCost)
        FROM Production.TransactionHistory AS TH2
        WHERE
            TH2.ProductID = TH.ProductID
            AND TH2.TransactionDate <= TH.TransactionDate
            AND TH2.TransactionDate >= DATEADD(DAY, -45, TH.TransactionDate)
    )
FROM Production.TransactionHistory AS TH
ORDER BY
    TH.ProductID,
    TH.TransactionDate, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql sql-server-2012 window-functions query-performance

59
推荐指数
5
解决办法
5万
查看次数

为什么 ALTER COLUMN 为 NOT NULL 会导致大量日志文件增长?

我有一个包含 64m 行的表,在磁盘上占用了 4.3 GB 的数据。

每行大约有 30 个字节的整数列,加上一个NVARCHAR(255)用于文本的变量列。

我添加了一个带有 data-type 的 NULLABLE 列Datetimeoffset(0)

然后我为每一行更新了这一列,并确保所有新的插入都在这一列中放置了一个值。

一旦没有 NULL 条目,我就运行这个命令来使我的新字段成为强制性的:

ALTER TABLE tblCheckResult 
ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL
Run Code Online (Sandbox Code Playgroud)

结果是事务日志大小大幅增长——从 6GB 增加到超过 36GB,直到空间用完!

有没有人知道 SQL Server 2008 R2 到底在为这个简单的命令做些什么来导致如此巨大的增长?

null sql-server sql-server-2008-r2 alter-table transaction-log

58
推荐指数
3
解决办法
4万
查看次数

在仅使用文字值的 WHERE 子句中替换 ISNULL() 有哪些不同的方法?

这不是关于:

这不是关于接受用户输入或使用变量的全面查询的问题。

这完全是关于ISNULL()WHERE子句中使用where用NULL金丝雀值替换值以与谓词进行比较的查询,以及在 SQL Server中将这些查询重写为SARGable 的不同方法。

你为什么不在那边坐?

我们的示例查询针对 SQL Server 2016 上 Stack Overflow 数据库的本地副本,并查找NULL年龄或年龄 < 18 岁的用户。

SELECT COUNT(*)
FROM dbo.Users AS u
WHERE ISNULL(u.Age, 17) < 18;
Run Code Online (Sandbox Code Playgroud)

查询计划显示了一个非常周到的非聚集索引的扫描。

坚果

scan 操作符显示(由于 SQL Server 的最新版本中对实际执行计划 XML 的补充)我们读取了每一行。

坚果

总的来说,我们进行了 9157 次读取并使用了大约半秒的 CPU 时间:

Table 'Users'. Scan count 1, logical reads 9157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, …
Run Code Online (Sandbox Code Playgroud)

sql-server

58
推荐指数
3
解决办法
2万
查看次数

造成死锁的主要原因是什么,它们可以预防吗?

最近我们的一个 ASP.NET 应用程序显示了一个数据库死锁错误,我被要求检查并修复该错误。我设法找到死锁的原因是一个存储过程,它严格更新游标内的表。

这是我第一次看到这个错误,不知道如何有效地跟踪和修复它。我尝试了我知道的所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份栏。

后来我发现为部署编写数据库脚本的开发人员搞砸了。我添加了一个主键,问题就解决了。

我感到很高兴并回到我的项目中,并做了一些研究以找出导致僵局的原因......

显然,这是导致死锁的循环等待条件。没有主键的更新显然比有主键需要更长的时间。

我知道这不是一个明确定义的结论,这就是我在这里发布的原因......

  • 缺少主键是问题吗?
  • 除了(互斥、保持等待、无抢占和循环等待)之外,是否还有其他条件会导致死锁?
  • 如何防止和跟踪死锁?

sql-server-2008 sql-server deadlock

57
推荐指数
5
解决办法
7万
查看次数