我有一个名为 Total 的数据库,其中有大约 40 个表。我正在尝试将数据库中的表移动到不同的服务器中所以我准备了所有创建表脚本,但问题是所有表都有外键,所以我想知道我必须执行表格的顺序。
有什么办法可以知道吗?
我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。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) 我正在处理一个表,其中事件的日期和时间以 YYYMMDDHHmmSS 或“20120606122012”格式存储为字符。我需要将其与当前时间戳进行比较,以查看自事件发生以来是否已经超过 20 分钟,但这似乎比我预期的要困难。
是否可以这样做,或者如果不能:是否有不同的方法有效?
我有一个 MSSQL Server 2008 数据库。
我的数据库中有一些表,如下所示:
table1, table2, table3, ....
每个表都有一个 NVARCHAR(50) 字段 ( Name)
现在,我想更改每个 sql 查询在该字段中插入的字符串,
例如:
我们有想要在Name字段中插入“示例文本”的查询。
我想使用 SQL 触发器将其更改为“示例名称”
是否可以使用 sql 触发器?如果是这样,如何?我对 T-SQL 很幼稚
有没有更好的方法可以用 SQL Server 做到这一点?
假设下面的查询是合法的并且执行成功,有什么办法可以加快速度吗?
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:我如何将其合并为一个查询?
我有一张这样的表:
CREATE TABLE T (
ID INT NOT NULL IDENTITY PRIMARY KEY,
CreateDateTime datetime2 NOT NULL,
--other columns
)
Run Code Online (Sandbox Code Playgroud)
我如何确保ID和CreateDateTime都以相同的顺序排序?换句话说,以下查询将返回相同的顺序:
select * from T order by ID
select * from T order by CreateDateTime
Run Code Online (Sandbox Code Playgroud)
我需要这个保证,因为出于性能原因,我想通过过滤 ID 列来查询日期范围。如果保证成立,这是可能的。
我想使违反该属性的 DML 失败。我的目的是捕捉破坏这个不变量的错误。
有没有办法在不使用触发器的情况下做到这一点?我希望有一个更优雅的解决方案。
我正在处理一个 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 条记录。只要提取正确百分比的记录,哪些记录并不重要。
关于如何解决这个问题的任何想法?
我正在使用此 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 脚本,当我想查看数据库中发生的事情时运行该脚本。该脚本有许多从 DMV 返回信息的查询,但我最常用的两个是“请求”(sys.dm_exec_requests、sys.dm_exec_sessions等)和“锁”(sys.dm_tran_locks)。输出类似于 SQL Server 活动监视器,但它显示更多信息。
有时,请求会出现在 Requests 查询中,但它会在 Locks 查询运行之前完成。例如,Requests 查询可能显示 SPID 51 正在等待锁定资源,但 Locks 查询不包含 SPID 51 的任何锁定信息。(我知道来自的wait_type和wait_resource列sys.dm_exec_requests。)
有没有办法确保这两个单独的查询显示数据库活动的连贯快照?
我预计商业数据库监控应用程序一定会遇到同样的问题。
我已经尝试在 SERIALIZABLE 并发中运行这些查询并向 DMV 连接添加锁定提示,但查询未获取锁定。无论如何,我不想在生产中这样做。
到目前为止,我最好的想法是:
从不同的会话同时运行这些查询。
在一个查询中加入请求和锁。考虑到我一次看到超过 100,000 个锁,这个连接会返回很多重复的请求和会话数据,但它可能会起作用。
我对扩展事件不够熟悉,不知道它们是否会更好地工作——也许是事件配对?
我有一列是 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 不允许结果具有多个数据类型。但我想我会问专家以确定。