小编Rac*_*hel的帖子

我可以从 SSMS 查询制表符分隔的文件吗?

是否可以从 Sql Server Management Studio 查询制表符分隔的文件以查看其数据而不将其保存在任何地方?

我知道您可以使用以下内容BULK INSERT从制表符分隔的文件中:

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');
Run Code Online (Sandbox Code Playgroud)

但是,这需要您提前知道列并创建一个表来保存数据。

我也知道您可以查询其他一些文件类型,例如 CSV 或 Excel,而无需使用OPENROWSETExcel 驱动程序提前定义列,例如:

-- Query CSV
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;', 
    'SELECT * FROM MyFile.csv')

-- Query Excel
SELECT *
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 
    'Excel 8.0;Database=MyFile.xls', 
    'SELECT * FROM [Sheet1$]')
Run Code Online (Sandbox Code Playgroud)

另外,如果我更改注册表项FormatHKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\TextCSVDelimitedTabDelimitedSQL Server上,上面的CSV查询将正确读取制表符分隔的文本文件,但是它将不再读取逗号分隔的文本文件,所以我不认为我想就这样离开它。

尝试使用Format=TabDelimitedOPENROWSET也不起作用

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;Format=TabDelimited', 
    'SELECT * …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 csv

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

使用 Synonyms 来避免创建重复表是个好主意吗?

我们有 3 个完全相同数据库的副本。所有 3 个数据库都有一个Users表,并且一个用户将始终存在于所有 3 个数据库中,并且具有完全相同的设置。任何时候我们想要添加或编辑用户,我们都必须更新 3 个数据库。

Users从数据库 2 和 3 中删除表并将其替换为Synonym指向数据库 1的表是否更好?

这是我能想到的优点/缺点:

优点

  • 更容易维护。可以在一个位置而不是 3 个位置更新用户
  • 用户 ID 将在数据库之间匹配(很重要,因为许多附加应用程序都基于用户 ID)

缺点

  • 不要认为这是标准程序,所以可能会造成混淆
  • 用户必须在数据库之间具有相同的设置
  • (来自下面gbn 的回答)如果数据库 1 出现故障,数据库 2 和 3 也将不可用。还存在恢复时数据不一致的潜在问题

这是我正在考虑的一个选项,用于包含数据库之间相同设置的几个不同表,而不仅仅是Users表。我在示例中使用用户,因为它很容易理解。

database-design sql-server

13
推荐指数
2
解决办法
5360
查看次数

如何从字符串中去除非数字字符?

用户在一个框中输入一个搜索词,该值被传递到一个存储过程,并根据数据库中的几个不同字段进行检查。这些字段并不总是具有相同的数据类型。

一个字段(电话号码)由所有数字组成,因此在检查它时会使用 .Net CLR 函数从字符串中去除所有非数字字符。

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')
Run Code Online (Sandbox Code Playgroud)

问题是,此功能有时会突然停止工作,并出现以下错误:

Msg 6533, Level 16, State 49, Line 2
AppDomain MyDBName.dbo[runtime].1575 被升级策略卸载,以确保 
应用程序的一致性。访问关键资源时发生内存不足。
System.Threading.ThreadAbortException:类型异常 
'System.Threading.ThreadAbortException' 被抛出。
System.Threading.ThreadAbortException: 

我已经尝试了MSDN 上针对此错误发布的建议,但仍然遇到问题。目前,切换到 64 位服务器不是我们的选择。

我知道重新启动服务器会释放它拥有的任何内存,但这在生产环境中不是一个可行的解决方案。

有没有办法仅使用 T-SQL 从 SQL Server 2005 中的字符串中去除非数字字符?

sql-server-2005 sql-server t-sql

13
推荐指数
2
解决办法
8万
查看次数

为什么使用 GROUP BY 子句的聚合查询比不使用 GROUP BY 子句要快得多?

我只是很好奇为什么聚合查询使用GROUP BY子句比没有子句运行得更快。

例如,这个查询需要将近 10 秒才能运行

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
Run Code Online (Sandbox Code Playgroud)

虽然这个只需不到一秒钟

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
Run Code Online (Sandbox Code Playgroud)

CreatedDate在这种情况下只有一个,因此分组查询返回与未分组查询相同的结果。

我注意到两个查询的执行计划是不同的 - 第二个查询使用 Parallelism 而第一个查询没有。

Query1 执行计划 Query2 执行计划

如果 SQL Server 没有 GROUP BY 子句,它以不同的方式评估聚合查询是否正常?在不使用GROUP BY子句的情况下,我可以做些什么来提高第一个查询的性能?

编辑

我刚刚了解到我可以使用OPTION(querytraceon 8649)将并行性的开销开销设置为 0,这使得查询使用一些并行性并将运行时间减少到 2 秒,尽管我不知道使用此查询提示是否有任何缺点。

SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我仍然更喜欢较短的运行时间,因为查询旨在根据用户选择填充一个值,因此理想情况下应该像分组查询一样是即时的。现在我只是结束我的查询,但我知道这并不是一个理想的解决方案。

SELECT Min(CreatedDate)
FROM
(
    SELECT Min(CreatedDate) as CreatedDate
    FROM MyTable WITH (NOLOCK) 
    WHERE SomeIndexedValue = 1
    GROUP …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2005 aggregate parallelism query-performance

12
推荐指数
1
解决办法
3万
查看次数

将列别名放在列定义的开头或结尾有什么区别吗?

我总是看到并将我的列别名写为

SELECT 1 as ColumnName
Run Code Online (Sandbox Code Playgroud)

但是今天遇到了一个使用的查询

SELECT ColumnName = 1
Run Code Online (Sandbox Code Playgroud)

这两个查询的执行方式有什么不同吗?或者 DBA 之间是否有关于使用哪一个的标准?

我个人认为,第二个会更容易阅读/(很好的例子保持更长的列定义在这里这篇文章),但我从来没有见过,所以今天很奇怪,之前使用的第二语法,如果有某种原因,我不应该使用它。

sql-server best-practices t-sql

12
推荐指数
2
解决办法
2353
查看次数

如果我对一个数据库进行故障转移,那么共享同一镜像端点的其他数据库也会进行故障转移吗?

我们有两个数据库设置用于在单个 SQL Server 实例上进行镜像:测试数据库和生产数据库。两者都使用完全相同的端点镜像到另一台服务器。

如果我进入测试数据库的数据库属性并单击“故障转移”按钮,它是否也会故障转移生产数据库,因为两个数据库共享一个镜像端点并且它们的服务器网络地址属性相同?

在此处输入图片说明

我很担心,因为当我为第二个数据库设置镜像时,我不需要配置任何新的东西。它只是使用了所有现有信息。

如果我使用“数据库属性”中的“故障转移”按钮,是否会导致故障转移使用该端点的所有数据库,或者只是我正在查看其属性的特定数据库?

sql-server-2005 sql-server mirroring failover

11
推荐指数
2
解决办法
2190
查看次数

如何修复“无法执行差异备份...当前数据库备份不存在”?

我们最近切换到FULL恢复模式,每个周末进行完整备份,每天进行差异化。

问题是,差异备份似乎并不总是有效。作业历史记录中记录的错误消息是

以用户身份执行:用户名。... 9.00.3042.00 为 32 位 版权所有 (C) Microsoft Corp 1984-2005。版权所有。
开始时间:上午 11:20:12 进度:2013-01-25 11:20:13.90 来源:{450389BA-54C2-4892-9CD0-0126CA9B0ED8} 执行查询“DECLARE @Guid UNIQUETEIDENTIFIER”%ECU10sp0.sp完成结束进度错误:2013-01-25 11:20:14.40 代码:0xC002F210
来源:备份数据库(差异)执行 SQL 任务
描述:执行查询“BACKUP DATABASE [MyDatabase] TO DISK = N'E:\Database Backups \MyDatabase_backup_201301251120.diff' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'MyDatabase_backup_20130125112014', SKIP, REWIND, NOUNLOAD, STATS = 10" 失败,出现以下错误:“无法对数据库“MyDatabase”执行差异备份,因为当前的数据库备份不存在。通过重新发出 BACKUP DATABASE 执行完整数据库备份,省略 WITH DIFFERENTIAL 选项。BA... 包执行fa... 步骤失败的。

完整备份作业每次都成功完成,我可以msdb.dbo.backupset使用此处找到的查询查看它,因此我知道它存在。看起来重新启动后,差异备份确实成功完成,直到下一次完整备份。

这是我的工作经历:

1/16 - 完整备份 - 成功
1/17 - 差异备份 - 成功
1/18 …

sql-server-2005 sql-server backup maintenance

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

我可以缩小镜像数据库上的事务日志文件吗?

这是上一个关于为什么我无法缩小主体数据库上的日志文件的问题的后续问题。

长话短说,我设置了数据库镜像,但忘记确保备份事务日志的作业再次运行,事务日志增长到近 60GB。

由于设置了镜像,这种大小的增加在镜像服务器上重复出现,最终占用了所有磁盘空间,使镜像数据库无法使用。

根据有关镜像数据库上事务日志维护的这个问题,您无法备份镜像上的日志,但是当在有关如何缩小镜像数据库上过度增长的日志文件的评论中特别询问时,留下了一条评论

一种方法是故障转移到镜像数据库并在那里进行收缩。在非生产环境中对此进行彻底测试,以确保它具有您想要/期望的行为。

这似乎表明可能有其他方法可以缩小镜像上的日志文件,并且这种方法在生产服务器上不一定安全。

有没有办法安全地缩小数据库镜像上的事务日志文件?

sql-server mirroring transaction-log

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

有没有办法通过重复 TableB 将 TableA 的每一行连接到较小的 TableB 的一行,但需要多次?

抱歉,标题令人困惑,我不知道在那里写什么。

我有一张包含几百条记录的表格。我需要将这个表的每条记录分配给一个更小的动态用户表,并且用户应该交替分配他们被分配的记录。

例如,如果表A是

Row_Number() 标识
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10

表B是

Row_Number() 标识
1 1
2 2
3 3

我需要一个最终结果集

用户 ID 记录 ID
1 1
2 2
3 3
1 4
2 5
3 6
1 7
2 8
3 9
1 10

我已经设法使用 mod 运算符做了一些有点混乱的事情,但是我很好奇是否可以在没有临时表和变量的情况下运行相同的查询。

使用临时表是因为 TableA 实际上是一个用户定义的函数,它将逗号分隔的字符串转换为表,我需要来自 UDF 的对象的计数。

-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 query-refactor

8
推荐指数
2
解决办法
481
查看次数

当它是镜像中的主体时,如何缩小物理事务日志文件?

我们在周末设置了数据库镜像,但忘记重新启用备份事务日志的作业。当我今天早上进来时,事务日志已经膨胀到 58GB,并且占用了大部分驱动器空间。

我将事务日志手动备份到磁盘以使数据库再次运行,但是运行 DBCC SHRINKFILE 似乎并没有减少事务日志文件的物理大小。

DBCC SHRINKFILE (N'MyDatabaseName_Log', 1000)
Run Code Online (Sandbox Code Playgroud)

如果我使用

DBCC SQLPERF(LOGSPACE)
Run Code Online (Sandbox Code Playgroud)

我可以看到只有 22% 的当前日志正在被使用

数据库名称 日志大小(MB) 已用日志空间 (%) 状态
我的数据库名称 55440.87 22.38189 0

如果我log_reuse_wait_desc在 sys.databses 中签出,我看到的唯一记录是DATABASE_MIRRORING,所以我猜测镜像在为什么日志文件的物理大小不会缩小方面发挥作用?

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = N'MyDatabaseName';
Run Code Online (Sandbox Code Playgroud)

我还注意到我的主要数据库镜像状态是暂停,并且尝试恢复它立即失败并出现以下错误:

数据库“MyDatabaseName”的远程镜像伙伴遇到错误 5149,状态 1,严重性 25。数据库镜像已暂停。解决远程服务器上的错误并恢复镜像,或删除镜像并重新建立镜像服务器实例。

镜像服务器上的错误日志也包含此错误,但也包含有关日志文件驱动器已满的错误

MODIFY FILE 在尝试扩展物理文件时遇到操作系统错误 112(磁盘空间不足。)。

F:\Databaselogs\MyDatabaseName_1.ldf: 遇到操作系统错误 112(磁盘空间不足。)。

主体服务器在日志文件驱动器上有 60GB(这里还有其他数据库托管),而镜像服务器只有 45GB。

备份日志文件使数据库再次可用,但是我还想减小磁盘上物理日志文件的大小,并恢复镜像。

如何在不影响镜像或备份链的情况下缩小物理事务日志文件的大小?

我正在运行 SQL Server 2005

sql-server-2005 sql-server backup mirroring transaction-log

8
推荐指数
1
解决办法
5285
查看次数