标签: t-sql

获取最新记录的最快方法

我正在寻找返回每个参考号的最新记录的最快方法。

我非常喜欢BrentOzar.com 的解决方案,但是当我添加第三个条件 (SequenceId) 时,它似乎不起作用。它似乎只有在我指定 Id 和创建日期时才有效。

要理解我的问题,您需要创建修改后的示例表,它本质上是上述参考网站上的表的副本,但稍有改动。

CREATE TABLE [dbo].[TestTable](
      [Id] [int] NOT NULL,
      [EffectiveDate] [date] NOT NULL,
      [SequenceId] [bigint] IDENTITY(1,1) NOT NULL,
      [CustomerId] [varchar](50) NOT NULL,
      [AccountNo] [varchar](50) NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
      [Id] ASC,
      [EffectiveDate] ASC,
      [SequenceId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[TestTable] ON
INSERT [dbo].[TestTable] ([Id], [EffectiveDate], [SequenceId], [CustomerId], [AccountNo]) 
VALUES (1, CAST(0xDF300B00 AS Date), 1, N'Blue', N'Green')
INSERT [dbo].[TestTable] ([Id], [EffectiveDate], [SequenceId], [CustomerId], [AccountNo]) 
VALUES …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql greatest-n-per-group query-performance

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

如何在存储过程完成之前获得响应?

我需要在完成之前从存储过程返回部分结果(作为简单的选择)。

有可能这样做吗?

如果是,如何做到这一点?

如果没有,有什么解决方法吗?

编辑:我有几个部分的程序。在第一部分我计算了几个字符串。我稍后会在过程中使用它们来进行附加操作。问题是调用者尽快需要字符串。因此,我需要计算该字符串并将其传回(不知何故,例如从选择中),然后继续工作。调用者更快地获得其有价值的字符串。

调用者是一个 Web 服务。

stored-procedures t-sql sql-server-2012 multi-thread web-service

9
推荐指数
3
解决办法
2998
查看次数

我们还应该使用 QUOTENAME 来防止注入攻击吗?

我今天正在查看一个旧的存储过程,并注意到它quotename在输入参数上使用。在做了一些挖掘以弄清楚它到底做了什么之后,我发现了这个站点。我现在了解它的作用以及如何使用它,但该站点表示它被用作 SQL 注入攻击的缓解措施。当我过去使用 asp.net 开发直接查询数据库的应用程序时,我会使用 ADO.Net 参数将用户输入作为文字值传入,而从不真正担心在我的存储过程中保护它。

我现在正在编写一个存储过程,该过程将由我不编写的应用程序使用,因此我确实需要尝试在过程级别防止注入攻击,这是quotename最好的方法还是有更新的功能/更好的方法?

让我了解这种思维模式的代码(@parm1是用户输入参数):

'SELECT project [Project], project_desc [Description], 
        customer [Customer], cpnyid [Company]
FROM PJPROJ (nolock)
where project like ' + quotename(@parm1,'''') + '
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-injection t-sql

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

我是否应该仅出于 PK 目的向交叉引用表添加自动增量/IDENTITY 字段?

我将以下交叉引用表添加到我的 SQL Server 托管的数据库中:

company_id bigint not null (FK)
org_path nvarchar (2048) not null
Run Code Online (Sandbox Code Playgroud)

company_id字段是指id另一个表中的字段(它是主键)。

鉴于也可以有多条记录具有相同的company_id,任何主键都必须使用这两个字段。但是,我无法使用这两个字段创建密钥,因为org_path对于 SQL Server 来说太长了。

至于org_path,这是它存在的唯一表。对该表的查询很可能会要求所有条目或所有org_path条目company_id。或者换句话说,这个表是否会被 查询,这看起来令人怀疑org_path。此外,不太可能org_path会更新,更有可能插入和 - 可能很少 - 删除。

我预计总行数将在数千个以内。

此外,这nvarchar (2048)是因为该值必须模仿第三方数据库中的值。一个典型的例子是这样的

\Translation Providers\[customer name]\[order name]\
Run Code Online (Sandbox Code Playgroud)

并且可以包含变音符号。

所以我的问题是:添加一个自动增量id字段并将其与company_id主键结合使用会更有效,还是会增加不必要的开销 -company_id另一个表中的主键这一事实是否有任何影响?效果在这里?

sql-server primary-key clustered-index t-sql

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

sp_msforeachdb 在幕后究竟是如何工作的?

我需要解决我遇到的问题,我需要一些帮助来了解 sp_msforeachdb 的工作原理以解决我的问题。

每次运行 sp_msforeachdb 时都会发生错误 Msg 102, Level 15, State 1, Incorrect syntax near '61'

我的代码示例如下:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''
Run Code Online (Sandbox Code Playgroud)

但是,我将什么查询作为 sp_msforeachdb 的参数并不重要。每次我都遇到同样的错误。我确实有一个以“61s1d”开头的数据库,所以我认为它的数据库名称有问题,但老实说,我不知道 sp_msforeachdb 的幕后情况。

注意事项。

  • 它是唯一以数字开头的数据库
  • 我可以尝试使用类似“如果数据库就像 '%61%' 不要做......”这样的代码,但仍然是同样的错误。
  • 我无法测试更改数据库名称——连接到它的东西太多。
  • 如果我创建一个以“51”开头的测试数据库,那么我也会收到该数据库的错误

我怎样才能克服这个问题?

sql-server stored-procedures t-sql

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

我可以从自引用(分层)表中获取树结构吗?

给定一个这样的分层表:

CREATE TABLE [dbo].[btree]
(
  id INT PRIMARY KEY
, parent_id INT REFERENCES [dbo].[btree] ([id])
, name NVARCHAR(20)
);
Run Code Online (Sandbox Code Playgroud)

我想获得整个树结构。

例如,使用此数据:

INSERT INTO [btree] VALUES (1, null, '1 Root');
INSERT INTO [btree] VALUES (2,    1, '1.1 Group');
INSERT INTO [btree] VALUES (3,    1, '1.2 Group');
INSERT INTO [btree] VALUES (4,    2, '1.1.1 Group');
INSERT INTO [btree] VALUES (5,    2, '1.1.2 Group');
INSERT INTO [btree] VALUES (6,    3, '1.2.1 Group');
INSERT INTO [btree] VALUES (7,    3, '1.2.2 Group');
INSERT INTO [btree] …
Run Code Online (Sandbox Code Playgroud)

hierarchy t-sql sql-server-2014

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

EXEC 与 SP_EXECUTESQL 性能

最近我们对我们的数据库使用了一个 sql 代码审查工具。建议使用SP_EXECUTESQL代替EXEC.

我知道SP_EXECUTESQL可以帮助我们避免 sql 注入。使用EXECvs时性能有什么不同吗SP_EXECUTESQL

performance sql-server dynamic-sql t-sql exec query-performance

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

快速有效地删除数据库并删除所有文件的最佳方法?

如果我将 Microsoft SQL Server 数据库设置为脱机并删除它,它将被删除,但日志和数据文件将保留。如果我在联机模式下执行此操作,则另一个连接可能会阻止我删除它。在开发环境中,或者对于我想定期清理并在生产环境中重新创建的数据库,清理数据库及其数据文件和日志文件的最佳 T-SQL 命令序列是什么,它会一直工作因为我有 sa 权限并且没有人恶意阻止我删除数据库?

sql-server t-sql

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

SSMS 和注册服务器结果

背景

我们正在尝试为我们的一个支持团队创建一个 AG“是主要的”测试工具。不知道在任何给定时间哪些服务器将是主服务器,它们被指示对注册的服务器组执行 TSQL。注册服务器组由AG中的所有服务器组成。目标是只在当前主服务器上执行 TSQL:

当前测试线束

IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS 
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id 
    WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END
Run Code Online (Sandbox Code Playgroud)

问题

如果响应多服务器查询的第一台服务器没有返回任何结果,SSMS 将假定正确的结果集没有结果集,即使其他服务器稍后返回结果集也是如此。因此,在这种情况下,不会返回任何结果……这是不正确的,也不是预期的功能。

谁能想出一种方法,使用 SSMS(这是 CS 团队最熟悉的工具),仅在当前主服务器上强制执行?

sql-server ssms t-sql

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

给表取别名后对象名无效?

当我运行以下查询时

select distinct A.movieID, A.avgStars from 
(select mID as movieID, avg(stars) as avgStars
from Rating
group by mID) A
where  A.avgStars <= all(select A.avgStars from A);
Run Code Online (Sandbox Code Playgroud)

我收到错误“无效的对象名称‘A’。”

你知道我为什么会得到这个吗?

谢谢!

sql-server t-sql

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