小编Tar*_*ryn的帖子

为什么 SQL Server 在使用 UNPIVOT 时要求数据类型长度相同?

将该UNPIVOT函数应用于未规范化的数据时,SQL Server 要求数据类型和长度相同。我明白为什么数据类型必须相同,但为什么 UNPIVOT 要求长度相同?

假设我有以下需要逆透视的示例数据:

CREATE TABLE People
(
    PersonId int, 
    Firstname varchar(50), 
    Lastname varchar(25)
)

INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
Run Code Online (Sandbox Code Playgroud)

如果我尝试 UNPIVOTFirstnameLastname列类似于:

select PersonId, ColumnName, Value  
from People
unpivot
(
  Value 
  FOR ColumnName in (FirstName, LastName)
) unpiv;
Run Code Online (Sandbox Code Playgroud)

SQL Server 生成错误:

Msg 8167, Level 16, State 1, Line 6

“姓氏”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。

为了解决错误,我们必须使用子查询首先将Lastname列强制转换为与以下相同的长度Firstname …

sql-server unpivot

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

如何在表格模型中计算/存储前 10 名?

我们最近创建了一个 SSAS 表格模型,以便我们的用户可以通过 PowerView 访问它。我们对我们的一个事实表进行了测量,以TotalActiveItems使用公式获取:

TotalActive:=COUNTAX(FILTER('Stats', ISBLANK([DeactDate]) = TRUE), 1)
Run Code Online (Sandbox Code Playgroud)

这在需要时非常有效,但现在我们有一个请求,以获取TotalActive.

作为参考,这是我们模型的一部分:

create table factStats
(
    StatsID INT IDENTITY NOT NULL PRIMARY KEY,
    DevID INT NOT NULL,
    DeactDate DATETIME NULL,
    BillDateTimeID BIGINT NOT NULL,
    CustID INT NOT NULL,
    ParentID INT NOT NULL
);

create table dimCust
(
    CustID INT NOT NULL PRIMARY KEY,
    CustName varchar(150) NOT NULL
);

create table dimParent
(
    ParentID INT NOT NULL PRIMARY KEY,
    ParentName varchar(100) NOT NULL
);

create table dimDateTime …
Run Code Online (Sandbox Code Playgroud)

ssas tabular-model

23
推荐指数
1
解决办法
3214
查看次数

服务器重新启动后,SQL Server 分布式可用性组数据库不同步

我们正准备对我们的 SQL Server执行大规模升级,并注意到分布式可用性组的一些异常行为,我正试图在继续之前解决这些问题。

上个月,我将远程辅助服务器从 SQL Server 2016 升级到 SQL Server 2017。该服务器是多个分布式可用性组 (DAG)和一个单独的可用性组 (AG) 的一部分。当我们升级这台服务器时,我们没有意识到它会进入一个不可读的状态,所以在过去的一个月里,我们一直完全依赖于主服务器。

作为即将进行的升级的一部分,我将CU 4补丁应用到服务器并重新启动它。当服务器重新上线时,刚刚打补丁的辅助服务器显示所有 DAG/AG 都在同步,没有任何问题。

然而,初选展示了一个非常不同的故事。报道称

  • 单独的 AG 同步没有任何问题
  • 但 DAG 处于不同步/不健康状态

在最初感到恐慌之后,我尝试了以下方法来使 DAG 中的事物再次同步:

  • 从主数据库中,我停止并恢复了数据移动。这并没有开始同步数据。
  • 在二级(我刚刚修补的那个)上我跑了ALTER DATABASE [<database] SET HADR RESUME;- 执行没有错误,但没有恢复任何同步

我最后一次再次同步数据的尝试是登录到辅助服务器,然后手动重新启动 SQL Server 服务。手动重新启动服务似乎有点极端,因为我希望重新启动服务器就足够了。

有没有人遇到过重启后 DAG 没有开始同步到辅助节点的问题?如果有,是如何解决的?

我检查了 SQL Server 错误日志和辅助服务器上的事件查看器,没有发现任何异常。

sql-server upgrade availability-groups sql-server-2017 distributed-availability-groups

22
推荐指数
1
解决办法
6325
查看次数

数据库设计:同一张表的两个一对多关系

我必须模拟一种情况,我有一个表 Chequing_Account(其中包含预算、iban 编号和帐户的其他详细信息),该表必须与两个不同的表 Person 和 Corporation 相关,这两个表都可以有 0、1 或多个支票帐户。

换句话说我有两个1对多关系,同一张表支票账户

我想听听尊重规范化要求的这个问题的解决方案。我听到的大多数解决方案是:

1) 找到一个 Person 和 Corporation 都属于的公共实体,并在它和 Chequing_Account 表之间创建一个链接表,这在我的情况下是不可能的,即使我想解决一般问题而不是这个特定实例。

2) 创建两个链接表 PersonToChequingAccount 和 CorporationToChequingAccount,它们将两个实体与支票账户相关联。但是我不希望两个人有同一个支票账户,也不希望一个自然人和一个公司共享一个支票账户!看到这张图片

http://i41.tinypic.com/35i6kbk.png

3) 在 Chequing Account 中创建两个指向 Corporation 和 Natural Person 的外键,但是我会因此强制一个人和一个公司可以拥有多个支票账户,但是我必须手动确保每个 ChequingAccount 行不是两个关系都指向公司和自然人,因为支票账户要么属于公司,要么属于自然人。看到这张图片

http://i40.tinypic.com/1rpv9z.png

这个问题还有其他更清洁的解决方案吗?

database-design

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

为什么具有聚集列存储索引的表会有许多打开的行组?

我昨天在查询时遇到了一些性能问题,经过进一步调查,我注意到我认为我试图深入了解聚集列存储索引的奇怪行为。

该表是

CREATE TABLE [dbo].[NetworkVisits](
    [SiteId] [int] NOT NULL,
    [AccountId] [int] NOT NULL,
    [CreationDate] [date] NOT NULL,
    [UserHistoryId] [int] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

与索引:

CREATE CLUSTERED COLUMNSTORE INDEX [CCI_NetworkVisits] 
   ON [dbo].[NetworkVisits] WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

该表目前有 13 亿行,我们不断向其中插入新行。当我说不断时,我的意思是一直。这是一次向表中插入一行的稳定流程。

Insert Into NetworkVisits (SiteId, AccountId, CreationDate, UserHistoryId)
Values (@SiteId, @AccountId, @CreationDate, @UserHistoryId)
Run Code Online (Sandbox Code Playgroud)

执行计划在这里

我还有一个每 4 小时运行一次的预定作业,用于从表中删除重复的行。查询是:

With NetworkVisitsRows
  As (Select SiteId, UserHistoryId, Row_Number() Over (Partition By SiteId, UserHistoryId
                                    Order By CreationDate Asc) RowNum
        From NetworkVisits
       Where CreationDate …
Run Code Online (Sandbox Code Playgroud)

sql-server columnstore sql-server-2017

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

备份 SQL Server 中的所有数据库

我有一个 Microsoft SQL Server 2005 DB 服务器。在数据库服务器中,我有大约 250 个用户数据库。我必须备份所有这些数据库。由于手动备份会消耗大量时间,我正在寻找一个批处理脚本或数据库脚本,它会自动备份所有 250 个数据库。任何人都可以帮忙吗?

sql-server-2005 sql-server backup

18
推荐指数
4
解决办法
5万
查看次数

SSIS 2012 创建环境变量失败

我正在编写一个脚本来将环境从一台服务器移植到另一台服务器。我遇到了一个调用问题,catalog.create_environment_variable其中出现错误“输入值的数据类型与‘字符串’的数据类型不兼容。” 从过程“check_data_type_value”出来。

奇怪的是,如果我让 GUI 脚本输出变量,该查询将起作用

DECLARE @var sql_variant = N'\\myserver\ssisdata'
EXEC [catalog].[create_environment_variable]
    @variable_name = N'FolderBase'
,   @sensitive = False
,   @description = N''
,   @environment_name = N'Development'
,   @folder_name = N'POC'
,   @value = @var
,   @data_type = N'String'
GO
Run Code Online (Sandbox Code Playgroud)

但是,采用这种脚本方法是行不通的。我所做的工作表明此错误消息通常是通过使用 nvarchar 数据类型而不是 varchar 来解决的。然而,我的东西不是这样。

以下脚本的第 108 行。我的假设是sql_variant 有点奇怪,但我不知道是什么。

USE SSISDB;
GO

DECLARE
    @folder_id bigint
,   @folder_name nvarchar(128) = N'POC'
,   @environment_name nvarchar(128) = N'Development'
,   @environment_description nvarchar(1024)
,   @reference_id bigint
,   @variable_name nvarchar(128) …
Run Code Online (Sandbox Code Playgroud)

ssis sql-server-2012 sql-variant-property

12
推荐指数
1
解决办法
5503
查看次数

产品属性列表设计模式

我正在更新我们网站的产品数据库。它内置于 MySQL 中,但这更像是一个通用的数据库设计模式问题。

我打算切换到超类型/子类型模式。我们当前/以前的数据库主要是单个表,其中包含有关单一类型产品的数据。我们正在考虑扩大我们的产品范围以包括不同的产品。

这个新的设计稿是这样的:

Product             product_[type]          product_attribute_[name]
----------------    ----------------        ----------------------------
part_number (PK)    part_number (FK)        attributeId (PK)
UPC                 specific_attr1 (FK)     attribute_name
price               specific_attr2 (FK)
...                 ...
Run Code Online (Sandbox Code Playgroud)

我有一个关于产品属性表的问题。这里的想法是产品可以具有给定属性的列表,例如颜色:红色、绿色、蓝色或材料:塑料、木材、铬、铝等。

此列表将存储在表中,该属性项的主键 (PK) 将在特定产品表中用作外键 (FK)。

(Martin Fowler 的著作Patterns of Enterprise Application Architecture称之为“外键映射”)

这允许网站界面拉取给定属性类型的属性列表,并在下拉选择菜单或其他一些 UI 元素中将其吐出。该列表可以被认为是属性值的“授权”列表。

拉动特定产品时最终发生的连接数量对我来说似乎过多。您必须将每个产品属性表连接到产品,以便您可以获取该属性的字段。通常,该字段可能只是名称的字符串 (varchar)。

这种设计模式最终会创建大量表,并且您最终会为每个属性创建一个表。抵消这种情况的一个想法是为所有产品属性创建一个更像是“抓包”表的东西。像这样的东西:

product_attribute
----------------
attributeId (PK) 
name
field_name
Run Code Online (Sandbox Code Playgroud)

这样,您的表可能如下所示:

1  red     color
2  blue    color
3  chrome  material
4  plastic material
5  yellow  color
6  x-large size
Run Code Online (Sandbox Code Playgroud)

这可以帮助减少表蠕变,但它不会减少连接的数量,而且将这么多不同类型组合到一个表中感觉有点错误。但是你可以很容易地获得所有可用的“颜色”属性。

但是,可能有一个属性具有比“名称”更多的字段,例如颜色的 RGB 值。这将要求该特定属性可能具有另一个表或具有用于名称:值对的单个字段(这有其自身的缺点)。

我能想到的最后一种设计模式是将实际属性值存储在特定产品表中,根本没有“属性表”。像这样的东西:

Product             product_[type] …
Run Code Online (Sandbox Code Playgroud)

mysql database-design

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

存储过程返回动态创建的表数据

简单的背景故事,我们正在与拥有调查系统的外部供应商合作。系统不一定设计得最好,因为当您创建新调查并且系统创建新表时,即:

Tables
____
Library_1 -- table for Survey 1
SurveyId int
InstanceId int
Q_1 varchar(50)

Library_2 -- table for Survey 2
SurveyId int
InstanceId int
Q_2 int
Q_3 int
Q_4 varchar(255)
Run Code Online (Sandbox Code Playgroud)

这些表用所生成的SurveyId在名称的末尾(Library_)和问题列与所产生的QuestionId在它(结束Q_)。 澄清一下,问题存储在单独的表中,因此虽然问题 id 是连续的,但对于每个调查,它们不会从 1 开始。问题列将基于表中分配给它们的 id。

查询似乎很简单,但我们需要从所有调查表中提取数据以发送到另一个系统,这就是问题所在。由于前台添加新调查时会自动创建表 -最终应用程序,其他系统无法处理这种类型的结构。他们需要数据一致才能消费。

因此,我的任务是编写一个存储过程,该过程将从所有调查表中提取数据并将其放置在以下格式中:

SurveyId    InstanceId    QNumber    Response
________    __________    _______    ________
1           1             1          great
1           2             1          the best
2           9             2          10
3           50            50         test
Run Code Online (Sandbox Code Playgroud)

通过让所有表格的数据采用相同的格式,无论存在多少调查表格和问题,任何人都可以使用这些数据。

我写了一个似乎可以工作的存储过程,但我想知道我是否遗漏了什么,或者是否有更好的方法来处理这种情况。

我的代码:

declare @sql varchar(max) …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures dynamic-sql sql-server-2008-r2

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

如何展平具有两个相关“许多”表的表的结果?

我重新组织了数据库中的一些表以使其更加灵活,但我不确定如何编写 SQL 以从中提取有意义的数据。

我有以下表格(为了更清楚的例子,有些缩写):

CREATE TABLE Loans(
    Id int,
    SchemaId int,
    LoanNumber nvarchar(100)
);

CREATE TABLE SchemaFields(
    Id int,
    SchemaId int,
    FieldName nvarchar(255)
);

CREATE TABLE LoanFields(
    Id int,
    LoanId int,
    SchemaFieldId int,
    FieldValue nvarchar(4000)
);
Run Code Online (Sandbox Code Playgroud)

使用以下数据:

INSERT INTO Loans (Id, SchemaId, LoanNumber) VALUES (1, 1, 'ABC123');

INSERT INTO SchemaFields (Id, SchemaId, FieldName) VALUES (1, 1, 'First Name');
INSERT INTO SchemaFields (Id, SchemaId, FieldName) VALUES (2, 1, 'Last Name');

INSERT INTO LoanFields (Id, LoanId, SchemaFieldId, FieldValue) VALUES (1, 1, 1, …
Run Code Online (Sandbox Code Playgroud)

pivot t-sql sql-server-2012

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