标签: t-sql

如何获取依赖顺序

我有一个名为 Total 的数据库,其中有大约 40 个表。我正在尝试将数据库中的表移动到不同的服务器中所以我准备了所有创建表脚本,但问题是所有表都有外键,所以我想知道我必须执行表格的顺序。

有什么办法可以知道吗?

foreign-key constraint t-sql sql-server-2008-r2

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

如何从链接服务器上的表中删除行

我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。OPENROWSET()似乎不是答案。

如果我这样做:

SET @sqlStr = '
    SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
        ''DELETE FROM [' + @DBName + '].dbo.tblName WHERE foo='bar') AS a';
EXEC (@sqlStr);
Run Code Online (Sandbox Code Playgroud)

我收到错误

Msg 11525, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1
The metadata could not be determined because statement 'DELETE FROM  . . .
Run Code Online (Sandbox Code Playgroud)

如果我添加SELECT 1;到查询中以便像下面那样返回结果集,我会得到一行一列的结果(顺便说一句,它的值不是“1”)。但是,不会发生删除操作。

SET @sqlStr = '
    SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
        ''SELECT 1; DELETE FROM [' …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql linked-server

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

将以 YYYMMDDHHmmSS 格式存储为 char 的日期时间转换为日期时间

我正在处理一个表,其中事件的日期和时间以 YYYMMDDHHmmSS 或“20120606122012”格式存储为字符。我需要将其与当前时间戳进行比较,以查看自事件发生以来是否已经超过 20 分钟,但这似乎比我预期的要困难。

是否可以这样做,或者如果不能:是否有不同的方法有效?

sql-server t-sql type-conversion datetime

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

寻找触发器来更改插入字符串?

我有一个 MSSQL Server 2008 数据库。
我的数据库中有一些表,如下所示:
table1, table2, table3, ....
每个表都有一个 NVARCHAR(50) 字段 ( Name)
现在,我想更改每个 sql 查询在该字段中插入的字符串,
例如:
我们有想要在Name字段中插入“示例文本”的查询。
我想使用 SQL 触发器将其更改为“示例名称”

是否可以使用 sql 触发器?如果是这样,如何?我对 T-SQL 很幼稚
有没有更好的方法可以用 SQL Server 做到这一点?

trigger sql-server-2008 sql-server t-sql

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

有什么办法可以在同一个大表上使用 3x UNION 来加速查询?

假设下面的查询是合法的并且执行成功,有什么办法可以加快速度吗?

SELECT foo from T1 --T1 is a huge (>5e6 rows) table with no indexes
UNION
SELECT bar from T1
UNION
SELECT baz from T1
UNION
SELECT qux from T1
Run Code Online (Sandbox Code Playgroud)

上面显示的四列都是 type nvarchar(128)、非稀疏和可为空的。我使用的是 SQL Server 2008。谢谢!

编辑:提供了更多信息。我无法添加索引,因为它是 Stage 表。另外,删除DISTINCTs; 我完全忘记了这一点。

Phil:我如何将其合并为一个查询?

sql-server-2008 sql-server t-sql union

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

确保两列以相同的顺序排序

我有一张这样的表:

CREATE TABLE T (
 ID INT NOT NULL IDENTITY PRIMARY KEY,
 CreateDateTime datetime2 NOT NULL,
 --other columns
)
Run Code Online (Sandbox Code Playgroud)

我如何确保IDCreateDateTime以相同的顺序排序?换句话说,以下查询将返回相同的顺序:

select * from T order by ID
select * from T order by CreateDateTime
Run Code Online (Sandbox Code Playgroud)

我需要这个保证,因为出于性能原因,我想通过过滤 ID 列来查询日期范围。如果保证成立,这是可能的。

我想使违反该属性的 DML 失败。我的目的是捕捉破坏这个不变量的错误。

有没有办法在不使用触发器的情况下做到这一点?我希望有一个更优雅的解决方案。

sql-server t-sql

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

根据列中的值返回记录的百分比

我正在处理一个 sql 查询,它需要根据特定列的值获取记录的百分比。百分比由用户给出。查询的精简版本如下

SELECT OrganizationID,
       CustomerID,
       OrderID
  FROM x
Run Code Online (Sandbox Code Playgroud)

输出看起来像

 OrganizationID, CustomerID, OrderID 
  123             abc         p456
  123             cba         p457 
  123             bac         p458 
  456             def         p987 
  456             efd         p988
Run Code Online (Sandbox Code Playgroud)

我需要能够为每个组织 ID 提取 50% 的输出。所以在这个例子中,我会返回 2-3 条记录。只要提取正确百分比的记录,哪些记录并不重要。

关于如何解决这个问题的任何想法?

sql-server-2008 t-sql

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

从存储过程中引用数据库?

我正在使用此 T-SQL 来获取索引统计信息(为简洁起见进行了编辑):

SET @db_id = DB_ID(N'TestDB');
SET @object_id = OBJECT_ID(N'TestDB.dbo.Users');
SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');
Run Code Online (Sandbox Code Playgroud)

我希望能够将它封装到一个存储过程中,并为存储过程所在的任何数据库调用它,但数据库名称是硬编码的,如何动态获取数据库名称?

T-SQL 有没有类似的东西:

SET @db_id = DB_ID(this);

sql-server t-sql

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

同步查询从 DMV 检索会话和锁

我有一个 SQL 脚本,当我想查看数据库中发生的事情时运行该脚本。该脚本有许多从 DMV 返回信息的查询,但我最常用的两个是“请求”(sys.dm_exec_requestssys.dm_exec_sessions等)和“锁”(sys.dm_tran_locks)。输出类似于 SQL Server 活动监视器,但它显示更多信息。

有时,请求会出现在 Requests 查询中,但它会在 Locks 查询运行之前完成。例如,Requests 查询可能显示 SPID 51 正在等待锁定资源,但 Locks 查询不包含 SPID 51 的任何锁定信息。(我知道来自的wait_typewait_resourcesys.dm_exec_requests。)

有没有办法确保这两个单独的查询显示数据库活动的连贯快照?

我预计商业数据库监控应用程序一定会遇到同样的问题。

我已经尝试在 SERIALIZABLE 并发中运行这些查询并向 DMV 连接添加锁定提示,但查询未获取锁定。无论如何,我不想在生产中这样做。

到目前为止,我最好的想法是:

  1. 从不同的会话同时运行这些查询。

  2. 在一个查询中加入请求和锁。考虑到我一次看到超过 100,000 个锁,这个连接会返回很多重复的请求和会话数据,但它可能会起作用。

我对扩展事件不够熟悉,不知道它们是否会更好地工作——也许是事件配对?

sql-server t-sql dmv

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

我可以使用 Try_Cast 为我提供具有不同数据类型的查询结果列吗?

我有一列是 varchar(max)。它主要包含有效的 XML。但有时它有无效的 xml(我仍然需要)。

我试图为这个表创建一个视图,当数据是有效的 XML 时,它允许值显示为 XML(使用 SSMS 附带的漂亮链接功能),但当它是无效的 XML 时仍然显示字符串。

像这样:

SELECT TRY_CAST([RunLog] AS xml) as [Log], -- works
       RunLog,                             -- Also Works

       -- This is the one I want, but it tries to parse all of them 
       -- (even the ones that fail the cast)
       Case 
           When Try_Cast(RunLog as xml) is NULL 
                Then NettinRunLoggLog else CAST(RunLog AS xml)
       end as CombinedLog

FROM   LoggingTable
Run Code Online (Sandbox Code Playgroud)

我认为这是一个失败的原因,因为 SQL Server 不允许结果具有多个数据类型。但我想我会问专家以确定。

sql-server t-sql sql-server-2012

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