以下查询可用于显示自定义表的定义。
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'PostHistory'
Run Code Online (Sandbox Code Playgroud)
不适用于 sys 表
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sys.time_zone_info'
Run Code Online (Sandbox Code Playgroud)
我猜这些信息在另一个数据库的另一个表中,它们是什么?
我也尝试过sp_help 'sys.time_zone_info',并且得到了
对对象“sp_help”、数据库“mssqlsystemresource”、架构“sys”的 EXECUTE 权限被拒绝。
我是一名 SQL Server DBA。为了自动执行一些日常任务,我需要编写存储过程。在没有测试的情况下创建功能对我来说没有意义。为了创建和运行我的测试,我使用了 tSQLt 框架。
我必须在测试期间创建一个数据库。多语句事务内不允许“CREATE DATABASE”,但所有测试都会在 tSQLt Framework 内的事务内自动运行。
当然,我可以在运行测试之前手动设置测试数据库,但测试不能依赖于执行它的环境。
应该如何处理这个问题?
我们的一位应用程序开发人员向我提出了一个有趣的问题。在下面的代码中,您将看到更新语句将当前列值分配给两个变量,同时还将这些相同的列更新为新值。
\n问题是,是否保证变量@oStart和@oFinish将被分配给[Start]和[Finish]的旧值而不是新值?在测试中,情况确实如此,但是,我想确认这是有保证的行为。
\n我预计答案是“不 - 不能保证”,最终,这取决于优化器所做的决定。无论如何,无论如何,这种模棱两可的代码都是不鼓励的(有更优雅和可读的编写方式),但有兴趣听到每个人的想法。
\n-- Parameters\nDECLARE @StartDate smalldatetime = '2022-01-01',\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @EndDate smalldatetime = '2022-12-31';\n\n-- Body\nDECLARE @oStart smalldatetime,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oFinish smalldatetime;\n\nUPDATE\xc2\xa0 [dbo].[MyTable]\nSET\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oStart = [Start],\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oFinish = [Finish],\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [Start] = @StartDate,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [Finish] = @EndDate\nWHERE\xc2\xa0\xc2\xa0 [ID] = 12;\nRun Code Online (Sandbox Code Playgroud)\n 我看到有人交换了下面的代码:
SELECT
PK1
, PK2
, PK3
, PK4
, C
, B
, SUM(NUMERIC_1)
, SUM(NUMERIC_2)
, MAX(NUMERIC_3)
, SUM(NUMERIC_4)
FROM MATDOC_EXTRACT
WHERE A = ''
AND (
(
(
B = ''
OR B = 'K'
)
AND (
C = '01'
OR C = '02'
OR C = '07'
OR C = '08'
)
)
OR (
B = ''
AND (
C = '03'
OR C = '04'
)
)
)
GROUP BY PK1
, PK2 …Run Code Online (Sandbox Code Playgroud) 我有几个表,通常具有可为空的“CreatedDate”和/或“ModifiedDate”日期时间列。我想要一个查询,可以从任何单个表中进行选择,其中一个、两个或都不存在日期时间列,并且每列都BETWEEN提供(单独的)范围。
这是一个粗略的(非工作的)示例。这尝试用来COL_LENGTH确定列是否存在。但是,如果一列不存在,则会引发错误,我相信是因为WHERE仍在评估整个列。
SELECT * FROM tableName
WHERE 1=1 AND
(COL_LENGTH(tableName, 'CreatedDate') IS NULL OR CreatedDate BETWEEN @CreatedFrom AND @CreatedTo) AND
(COL_LENGTH(tableName, 'ModifiedDate') IS NULL OR ModifiedDate BETWEEN @ModifiedFrom AND @ModifiedTo)
Run Code Online (Sandbox Code Playgroud)
这可以通过动态 SQL 来解决。但是,在这种情况下,我仅限于以读取为中心的权限。所以没有 EXEC、CREATE 或 INSERT。
这可以用静态 SQL 实现吗?
两列:
DECLARE @Table1 table
(
Id int NOT NULL,
CreatedDate datetime NULL,
ModifiedDate datetime NULL
);
INSERT @Table1
(Id, CreatedDate, ModifiedDate)
VALUES
(1, NULL, NULL),
(2, NULL, '20230101 01:23:45.678'),
(3, '20230101 02:34:56.789', NULL),
(4, …Run Code Online (Sandbox Code Playgroud) 对于下面的查询,我试图弄清楚为什么 SQL Server 在 sysjobhistory 表上建议的索引(也是导致查找的索引)是在 Job_Id 列上创建的,其中包括其他列:
Job_Id 包括(Run_date、Run_time、Instance_id)
据我了解,where 子句中的列应该出现在索引键中,以便可以进行搜索。Run_date 和 Run_time 出现在下面查询的 where 子句中,那么我们为什么可以将它们包含在索引中而不是将它们作为键列呢?
查询:
SELECT TOP 10000 run_date
FROM msdb.dbo.sysjobhistory sh
WHERE EXISTS (SELECT 1 FROM msdb.dbo.sysjobs sj WHERE sh.job_id = sj.job_id
AND EXISTS (SELECT 1 FROM msdb.dbo.sysjobschedules sjs WHERE sjs.job_id = sj.job_id
AND EXISTS (SELECT 1 FROM msdb.dbo.sysschedules ss WHERE ss.schedule_id = sjs.schedule_id
AND ss.freq_subday_type = 2
AND ss.freq_subday_interval = 10 )))
AND CAST(CAST([run_date] AS CHAR(8)) + ' ' + STUFF(STUFF(RIGHT('000000' + CAST([run_time] AS VARCHAR(6)), …Run Code Online (Sandbox Code Playgroud) 即使对于相同的查询,计划缓存和查询存储也不相同。当寻找特定查询或一组相关查询的性能或监视信息时,每个查询的优点/缺点是什么?
我的在线研究表明的总体印象是,查询存储可以比计划缓存更快地查询(我不确定为什么),并且它的条目往往持续更长时间(这是可配置的),但我没有发现任何说法关于计划缓存优于查询存储的情况。
假设我不关心 SQL Server 2017 和 2022 引入的使用查询存储进行自动性能调优的功能。相反,假设我比较查询存储和计划缓存是出于两者可以执行的任务的目的。
我根据这篇文章设置了一些警报
现在我想让alert触发的Job向ac#应用程序发送一些信息(这个应用程序可以运行在SQL实例的同一台机器上,然后C#应用程序将信息发送到其他机器上)。
我的应用程序可以接受 TCP 连接,所以我正在考虑使用它,但也欢迎 SQL 服务器与我的应用程序通信的任何其他形式。
关于我如何做到这一点的任何建议?
*编辑: *能够通过 T-SQL 在另一个数据库(在其他情况下)中进行插入也可以解决我的问题。
背景信息: 我这样做是为了监视主体服务器何时公开运行以及镜像服务器何时同步。因此,如果证人出现故障,然后校长也出现故障,根据这些警报的记录,我可以判断将镜像升级为校长是否安全。
请注意,在这种情况下,我无法在不破坏镜像配置的情况下读取镜像数据库,因此在镜像数据库中使用表不是解决方案。
以下摘录是从本页摘录。
CURRENT_USER (Transact-SQL)
返回当前用户的名称。此函数等效于 USER_NAME()。
当我使用以下 TSQL 脚本(有问题的脚本被注释)执行这两个函数时,我对调用语法感到困惑。我想知道何时使用括号,何时不使用。谢谢!
SELECT CURRENT_USER
-- SELECT CURRENT_USER() -- Error!
SELECT USER_NAME()
-- SELECT USER_NAME -- Error!
Run Code Online (Sandbox Code Playgroud) 我正在拉回订单列表,但我只需要显示一定比例的记录。例如,我们想要前 30 名或前 50 名。百分比是可变的,所以我不想使用 TOP。我尝试了下面的代码,但没有返回任何记录。
SELECT x.SelectionCriteriaID,
x.DeliveryCriteriaID,
x.SurveyID,
x.intappid,
x.intcustomerID,
x.intorderid,
x.RowNumber RowNumber,
x.cntoid
FROM (SELECT @SelectionCriteriaID SelectionCriteriaID,
@DeliveryCriteriaID DeliveryCriteriaID,
@SurveyID SurveyID,
ord.intappid,
ord.intcustomerID,
ord.intorderid,
ord.cntoid,
ROW_NUMBER() OVER (ORDER BY ord.intcustomerid) AS RowNumber
FROM ord
WHERE ord.cntoid >= ISNULL(@MinNumberOrders, 1)
AND ord.cntoid < ISNULL(@MaxNumberOrders, 999999999))x
GROUP BY x.SelectionCriteriaID, x.DeliveryCriteriaID, x.SurveyID, x.intappid, x.intcustomerID, x.intorderid, x.RowNumber, x.cntoid
HAVING x.rownumber < MAX(x.RowNumber)/(100/@percent)
Run Code Online (Sandbox Code Playgroud) t-sql ×10
sql-server ×9
index ×1
index-tuning ×1
mirroring ×1
monitoring ×1
plan-cache ×1
query ×1
query-store ×1
tsqlt ×1
union ×1