今天七周内的七个数据库向我介绍了每个操作员的索引。
您可以通过创建
text_pattern_ops运算符类索引来为匹配先前查询的模式索引字符串,只要值以小写形式索引即可。
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
我们使用 是
text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_ops,bpchar_pattern_ops和name_pattern_ops。
我觉得这个例子真的很混乱。为什么这样做有用?
如果该列是文本类型,那么在用作搜索值之前,其他类型(varchar、char、name)不会被强制转换为文本吗?
该索引的行为与使用默认运算符的索引有何不同?
CREATE INDEX moves_title_pattern ON movies (lower(title));
Run Code Online (Sandbox Code Playgroud) 我写了两个函数来回答七周内七个数据库中第 3 天的第一个作业问题。
创建一个存储过程,您可以在其中输入您喜欢的电影名称或演员的名字,它会根据演员主演的电影或类似类型的电影返回前五名的建议。
我的第一次尝试是正确的,但速度很慢。返回结果最多可能需要 2000 毫秒。
CREATE OR REPLACE FUNCTION suggest_movies(IN query text, IN result_limit integer DEFAULT 5)
RETURNS TABLE(movie_id integer, title text) AS
$BODY$
WITH suggestions AS (
SELECT
actors.name AS entity_term,
movies.movie_id AS suggestion_id,
movies.title AS suggestion_title,
1 AS rank
FROM actors
INNER JOIN movies_actors ON (actors.actor_id = movies_actors.actor_id)
INNER JOIN movies ON (movies.movie_id = movies_actors.movie_id)
UNION ALL
SELECT
searches.title AS entity_term,
suggestions.movie_id AS suggestion_id,
suggestions.title AS suggestion_title,
RANK() OVER (PARTITION BY searches.movie_id ORDER BY …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 SQL Server 实例导出一个简单的维护计划。
我想检查导出到源代码管理,并将导出的维护计划应用于功能相同的实例。
StackOverflow和SQL Server Newbie建议使用 Integration Services 导出维护计划。
当我尝试连接到导出目标上的集成服务时,我收到以下错误:
连接到计算机“WEBSERVER”上的集成服务服务失败并出现以下错误:指定的服务不作为已安装的服务存在。
我们选择在 WEBSERVER 上禁用集成服务,因为我们仅使用此框为消费者应用程序提供数据。WEBSERVER 上的所有数据都是从后端实例复制的。Integration Services 大量用于处理后端实例上的数据。
是否有不使用集成服务导出维护计划的文档化方法?微软支持吗?
我的服务器的默认排序规则是 Latin1_General_CI_AS,由以下查询确定:
SELECT SERVERPROPERTY('Collation') AS Collation;
Run Code Online (Sandbox Code Playgroud)
我惊讶地发现,通过这种排序规则,我可以使用 predicate 匹配字符串中的非数字字符LIKE '[0-9]'。
为什么在默认排序规则中会发生这种情况?我想不出这会有用的情况。我知道我可以使用二进制排序规则来解决该行为,但这似乎是实现默认排序规则的奇怪方法。
我可以通过创建一个包含所有可能的单字节字符值的列并使用数字匹配谓词过滤值来演示该行为。
以下语句创建一个包含 256 行的临时表,当前代码页中的每个代码点对应一个行:
WITH P0(_) AS (SELECT 0 UNION ALL SELECT 0),
P1(_) AS (SELECT 0 FROM P0 AS L CROSS JOIN P0 AS R),
P2(_) AS (SELECT 0 FROM P1 AS L CROSS JOIN P1 AS R),
P3(_) AS (SELECT 0 FROM P2 AS L CROSS JOIN P2 AS R),
Tally(Number) AS (
SELECT -1 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM P3 …Run Code Online (Sandbox Code Playgroud) 我维护一个存档数据库,该数据库将历史数据存储在分区视图中。分区列是日期时间。视图下的每个表存储一个月的数据。
我们使用日期时间列上的检查约束来约束每个表上的事件。这允许优化器限制为在事件日期时间列上过滤的查询而搜索的表。
检查约束的名称是由 SQL Server 生成的,因此通过查看名称很难知道它们的作用。
我希望约束名称的形式为“CK_TableName_Partition”。
我可以使用此查询生成重命名脚本并从 sql_text 列复制数据。WHERE 子句匹配名称看起来像是由 SQL Server 生成的检查约束:
SELECT
checks.name AS check_name,
tabs.name AS table_name,
skemas.name AS schema_name,
cols.name AS column_name,
N'
EXECUTE sys.sp_rename
@objname = N''' + skemas.name + N'.' + checks.name + N''',
@newname = N''CK_' + tabs.name + N'_Partition'',
@objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols …Run Code Online (Sandbox Code Playgroud) mscorsvw自从我安装了 SQL Server 2012 Service Pack 1 以来,.NET 运行时优化服务 ( ) 一直在消耗我工作站的所有内存。
在耗尽所有可用内存之前,它会消耗大约 1.6 GB 的内存:

我可以终止该进程,但是当我重新启动计算机或等待足够长的时间时它会再次发生。
Techdows建议使用 .NET Native Image Generator ( ngen) 来解决该问题。
我打开命令提示符并运行如下命令:
cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319.1
ngen executeQueuedItems
Run Code Online (Sandbox Code Playgroud)
的内存消耗mscorsvw下降到大约 20-30 MB,并ngen消耗了所有剩余的内存。
ngen在我终止进程之前只生成错误消息。输出的前几行如下所示:
Microsoft (R) CLR Native Image Generator - Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Failed to load dependency Microsoft.DataWarehouse of assembly
Microsoft.SqlServer.MaintenancePlanTasks, Version=11.0.0.0, Culture=neutral,
PublicKeyToken=89845dcd8080cc91 because of the following error : The system
cannot find the …Run Code Online (Sandbox Code Playgroud) 以下脚本第一批调用sp_trace_create带参数的存储过程,按文档顺序;第二批交换参数的位置@tracefile和@options:
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@trace_id = @new_trace_id OUTPUT,
@options = 0,
@tracefile = N'C:\temp\TestTrace';
SELECT @new_trace_id AS [@new_trace_id];
EXECUTE master.dbo.sp_trace_setstatus
@trace_id = @new_trace_id,
@status = 2;
GO
DECLARE @new_trace_id INT;
EXECUTE master.dbo.sp_trace_create
@trace_id = @new_trace_id OUTPUT,
@tracefile = N'C:\temp\TestTrace',
@options = 0;
EXECUTE master.dbo.sp_trace_setstatus
@trace_id = @new_trace_id,
@status = 2;
GO
Run Code Online (Sandbox Code Playgroud)
第一批创建一个新的跟踪,选择它的 id,然后关闭跟踪。返回一个结果集:
@new_trace_id
2
Run Code Online (Sandbox Code Playgroud)
第二批失败并出现错误:
消息 214,级别 16,状态 3,过程 sp_trace_create,第 1 行 过程需要类型为“nvarchar(256)”的参数“@tracefile”。
为什么参数顺序会影响存储过程的输出sp_trace_create?为什么它会以如此误导性的错误消息失败?
我正在尝试设置订阅者对 SQL Server 发布的推送订阅。
我可以使用 Management Studio 中的复制向导在发布者处设置订阅。但是,我更愿意编写相对于订阅者的流程脚本,以便我可以自动部署新的 SQL Server 订阅者实例。
最初,我很乐意在部署前提示输入发布者的名称。如果我可以让它工作,我会寻找一种方法来自动为我的环境注入正确的值。
对于必须在不同发布者上创建多个订阅的 SQL Server 实例,执行此操作的简单方法是什么?
我愿意使用任何受支持的 SQL Server 脚本解决方案:SMO、RMO、Sqlcmd、WMI、PSDrive,甚至是纯 T-SQL。
我试图通过两种方式解决这个问题。第一个是使用 T-SQL 的完整解决方案,但它涉及一些手动步骤。
我在 T-SQL 中有一个手动解决方案。该解决方案基于 Management Studio Replication Script Generator 输出的输出。
使用 Management Studio,我运行以下脚本以生成可在发布者处运行的 T-SQL 脚本:
PRINT N'
EXECUTE MyDatabase.dbo.sp_addsubscription
@publication = N''MyPublication'',
@subscriber = ''' + CAST(SERVERPROPERTY('ServerName') AS SYSNAME) + ''',
@destination_db = ''SubscriberDatabase'',
@subscription_type = N''Push'',
@sync_type = N''automatic'',
@article = N''all'',
@update_mode = N''read only'',
@subscriber_type = 0;
EXECUTE MyDatabase.dbo.sp_addpushsubscription_agent
@publication …Run Code Online (Sandbox Code Playgroud) 您好,我正在将数据库迁移到 SQL Server 2012,但遇到了问题。
首先让我说应用程序 (ISV) 具有可怕的安全性!所以尽量不要畏缩太多。
所以 2012 实例上的 sa 密码必须与应用登录名匹配。但是,它不符合 2012 年密码要求。
有没有办法覆盖这个功能?
假设您要查询数据库以发现它包含的触发器类型。一种方法是对数据库中的所有触发器对象使用 OBJECTPROPERTY 函数。
有时 OBJECTPROPERTY 函数会产生令人困惑的结果。它的输出似乎取决于数据库上下文。
以下示例查询为 msdb 中的每个 sysmail 触发器返回一行:
SELECT
object_id,
name,
OBJECTPROPERTY(object_id, 'ExecIsInsertTrigger') AS IsInsertTrigger,
OBJECTPROPERTY(object_id, 'ExecIsUpdateTrigger') AS IsUpdateTrigger,
OBJECTPROPERTY(object_id, 'ExecIsDeleteTrigger') AS IsDeleteTrigger
FROM msdb.sys.objects
WHERE
[type] = 'TR' AND
name LIKE 'trig_sysmail_%';
GO
Run Code Online (Sandbox Code Playgroud)
目的是找出什么 DML 操作将触发每个触发器。例如,IsInsertTrigger如果触发器定义为AFTER INSERT,则该列包含 1 ,否则为0。
当我在 msdb 的上下文中执行查询时,结果集在每个计算列中都包含 0 或 1。它看起来像这样:
object_id name IsInsertTrigger IsUpdateTrigger IsDeleteTrigger
----------- ---------------------------- --------------- --------------- ---------------
713105631 trig_sysmail_profile 0 1 0
745105745 trig_sysmail_account 0 1 0
761105802 trig_sysmail_profileaccount 0 1 0
777105859 trig_sysmail_profile_delete …Run Code Online (Sandbox Code Playgroud) sql-server ×7
collation ×2
optimization ×2
postgresql ×2
index ×1
powershell ×1
replication ×1