我之前曾在 SQL Server 环境中工作过,其中日志记录是我们存储过程的一部分,用于捕获执行开始/结束、参数值和错误消息,我发现这非常有用,并且是我希望在新环境中引入的内容。
用于此日志记录的表如下所示,使用语句将参数捕获INSERT
到表中,并将 with 值隐式转换为NVARCHAR
。
CREATE TABLE dbo.Execution
(
Id INT IDENTITY(1,1) NOT NULL
, SchemaName NVARCHAR(128) NOT NULL
, ProcedureName NVARCHAR(128) NOT NULL
, ExecutionStart DATETIME NOT NULL
, ExecutionEnd DATETIME NULL
, ExecutionFailed BIT NOT NULL
)
CREATE TABLE dbo.ExecutionError
(
Id INT IDENTITY(1,1) NOT NULL
, ExecutionId INT NOT NULL
, CustomErrorMessage NVARCHAR(8000) NULL
, SqlErrorMessage NVARCHAR(8000) NULL
)
CREATE TABLE dbo.ExecutionParameter
(
Id INT IDENTITY(1,1) NOT NULL
, ExecutionId INT …
Run Code Online (Sandbox Code Playgroud) 我有一个包含 80 多个稀疏列和一个列集列的表,这是一个简单的例子:
DROP TABLE IF EXISTS #ColumnSet
GO
CREATE TABLE #ColumnSet
(
Id INT NOT NULL
, Value1 VARCHAR(100) SPARSE NULL
, Value2 VARCHAR(100) SPARSE NULL
, Value3 VARCHAR(100) SPARSE NULL
, Value4 VARCHAR(100) SPARSE NULL
, AllValues XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
)
GO
INSERT INTO #ColumnSet
(Id, Value1, Value2, Value3, Value4)
VALUES
(1, 'POSITIVE', NULL, NULL, NULL),
(2, 'NEGATIVE', NULL, 'NEGATIVE', NULL),
(3, NULL, NULL, 'NEGATIVE', 'POSITIVE'),
(4, 'NEGATIVE', NULL, 'THIS IS NOT A POSITIVE RESULT', NULL)
GO …
Run Code Online (Sandbox Code Playgroud) 我为 SSRS 2008 创建了一份报告,其结果如下。
我希望实现的是粉红色,AD 中的那些结果在 AM 和 PM 下,文本居中,即合并的单元格。
工作日和上午/下午是基于我表中字段的矩阵中的组标题。为了显示数据,我使用了矩阵数据区域内的表格。
我已经阅读了其他关于在表中创建一个附加行的其他帖子,该行将 2 个单元格合并在一起,使用表达式在不使用时隐藏该行,尽管我没有设法让它正常工作。
2012 年 3 月 28 日更新:
我设法让 AD 出现在 AM 和 PM 下。我所做的是删除 AM/PM 列组并在 Weekdays 组下创建 2 个单元格,并在这些单元格中输入文本 AM 和 PM。然后我在矩阵的数据部分创建了 2 行,底行有 2 列。在这些单元格中的每一个中,都有一个带有表达式的表格
=IIF(Fields!SessionIdentifier.Value="AD","AD",Nothing)
每个表中的行可见性是使用表达式设置的:
=IIF(Fields!SessionIdentifier.Value="AD", False, True)
我现在想做的是在矩阵为空时隐藏矩阵数据区域中的顶行,但我还没有想出执行此操作的表达式。
如果我查询存在于两个不同模式但具有相同名称的表,是什么决定了使用哪个表?
例如,我的表Bar
同时存在于dbo
和 中foo
,如果我执行下面的语句,则返回一个:
SELECT * FROM Bar
Run Code Online (Sandbox Code Playgroud)
我认为这是由用户默认架构决定的,但似乎并非如此。
我问是因为我发现其他人编写的查询没有指定模式名称,但被查询的数据库在 ETL 的不同模式中具有相同的表。
我有一个视图,其中涉及 20 多个表上的 LEFT JOINS 到基表,但是在查询此视图并查看执行计划时,我得到了完全出乎意料的结果。
例如,对于下面的查询,我希望在表上进行聚集索引查找:
SELECT id FROM dbo.TableName WHERE id = 256
Run Code Online (Sandbox Code Playgroud)
而当我使用视图时,我会在表上找到聚集索引以及 3 个嵌套循环(左外连接)。
SELECT id FROM dbo.ViewName WHERE id = 256
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况?上面是一个非常简单的例子,但是当从视图中选择额外的列时,越来越多的不必要的 LEFT JOINS 出现在执行计划中。