标签: sql-server-2012

稳定的三角关系?

我有一个代表特定类型操作的表格。让我们称之为[ACTION]

一个操作可以由用户 ( [USER]) 执行,所以我有关系[USER] 1:N [ACTION]

用户可以有孩子 ( [CHILD]),所以[USER] 1:N [CHILD].

问题开始于操作必须由用户执行的事实,但是它可以用户或其子代之一执行。

如果每个用户总是有一个或多个孩子,我可以简单地做[CHILD] 1:N [ACTION]而不是[USER] 1:N [ACTION],因为在孩子身上我会找到执行操作的用户。

如果我只是 add [CHILD] 0...1:N [ACTION],那么 child 成为 action 表中的一个可选字段,可能会添加一个不属于添加到 action 的用户的 child。

问题

  1. 这种情况通常称为什么?

  2. 如何克服这个问题或者我能走的最好的方法是什么?

我不想在代码中检查这个,仅数据库(SQL Server 2012)解决方案将是完美的。

例子

行动是一种投资。用户将始终接受投资,但他/她可以决定他/她是为他/她还是为他/她的孩子之一投资。在这种情况下,孩子总是未成年。如果孩子足够大,可以自己进行投资,那么它将注册并成为用户。所以这就是为什么孩子不能成为用户的原因。他们需要保持两个不同的实体。

所以我有点需要两个彼此保持稳定的关系。我需要知道(用户)采取了行动(投资),我需要知道为谁(用户或他/她的孩子之一)采取了行动(投资)。

我正在寻求一种解决方案,即不能与用户无关的孩子采取行动(投资)。换句话说,父亲/母亲只能为他/她或他/她的孩子投资,不能为别人的孩子投资。

database-design sql-server sql-server-2012

5
推荐指数
1
解决办法
1263
查看次数

QUERY - 根据日期和过滤结果连接两个表

我为这个神秘的标题道歉。我想我无法将我的问题浓缩为一个标题,这表明我无法回答以下问题:

我有两个表(MS SQL Server 2012)中的数据。一张桌子producedpackaged

中的数据produced具有order number,product codestart date

产生

pr_order |   code  |   startdate
---------------------------------
8000009  |   pr_12 |   2016-05-23
8000002  |   pr_12 |   2016-04-01
8000001  |   pr_12 |   2016-03-29

8000010  |   pr_10 |   2016-05-26
8000008  |   pr_10 |   2016-05-01
etc.
Run Code Online (Sandbox Code Playgroud)

在数据packagedorder numberproduced product codepackaged product code和一个start date

包装好的

pa_order |  pr_code |   pa_code  |  startdate
---------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

sql-server-2012

5
推荐指数
1
解决办法
1427
查看次数

查询每组最近邻的空间数据

我想查询最近邻的空间数据。我正在使用这篇文章,以下查询完美运行:

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL          
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是我需要为每个MSPID. 我尝试了几件事(使用交叉应用,创建单独的函数等)但没有任何效果。所以,我决定创建一个循环来计算每个MSPID.

SELECT TOP 1 [Location].STDistance(@Location)
FROM [DS1]
WHERE [Location].STDistance(@Location) IS NOT NULL 
    AND @CurrentMSPID = [MSPID]         
ORDER BY [Location].STDistance(@Location);
Run Code Online (Sandbox Code Playgroud)

问题是上面的语句没有使用索引。如果我@CurrentMSPID用一个数字替换使用索引,但是当使用一个变量时,使用聚集索引而不是空间索引。

我尝试了很多选择,唯一有效的是:

OPTION (OPTIMIZE FOR ( @CurrentMSPID  = 1001 ))
Run Code Online (Sandbox Code Playgroud)

或者当值是硬编码时。我不能那样做,因为将来这id甚至可能不存在,并且肯定会更改它匹配的行数。

[DS1]表在[MSPID]列上有主键,在列上有空间索引[Location]

如何在不使用OPTIMIZE FOR选项的情况下帮助引擎生成更好的执行计划并使用空间索引?


当从表中提取其他数据时(我们MSPID现在正在过滤),引擎似乎无法使用空间索引并执行聚集索引查找。

sql-server sql-server-2012 spatial sql-server-2014 nearest-neighbor

5
推荐指数
1
解决办法
4244
查看次数

累积总和的 SQL 查询

我在制定(相对)简单的 SQL 查询(使用 SQL Server 2012)时遇到问题。我们有一个数据库,可以为某些用户计算一些东西。因此,我们有一个非常简单的数据库结构,由两个表组成。

users

PK_User, uniqueidentifier
ID, bigint
Username, nvarchar(128)
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

data

PK_Data, uniqueidentifier
FK_User, uniqueidentifier
FK_Reporter, uniqueidentifier
CreationTimestamp, datetime
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下 SQL 语句:

SELECT u.Username, COUNT(d.FK_User) AS 'Count', CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime) AS 'Date'
FROM data d INNER JOIN users u ON u.PK_User = d.FK_User
GROUP BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime), u.Username
ORDER BY CAST(FLOOR(CAST(d.CreationTimestamp AS float)) AS datetime)
Run Code Online (Sandbox Code Playgroud)

它提供了这样的东西:

User1   5   %Date1%
User2   3   %Date1%
User1   7   %Date2%
User2 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sum running-totals

5
推荐指数
1
解决办法
9446
查看次数

服务代理内部 spid 占用 tempdb

我们最近在多次接近中断后停用了一个实施得相当糟糕的服务代理设置,但是在我早上检查时,我注意到有 2 个服务代理内部 SPID (<50) 仍然持有约 75% 的 TempDB空间。

现在,我知道这些是服务代理任务,因为 SysProcesses 上的 CMD 列显示“BRKR EVENT HNDLR”和“BRKR TASK”,而最后的等待类型分别是“BROKER_EVENTHANDLER”和“SLEEP_TASK”。两者都将“背景”作为状态,0 开放交易和一个多月前的最后一批时间。

目前服务代理实现已完全禁用(从代码角度),队列已禁用(is_activation_enabled 和 is_receive_enabled = 0),transmission_queue、conversation_endpoints 或实际队列中没有任何内容,但有问题的数据库仍然有 is_broker_enabled = 1(与 TempDB 和 MSDB 一样)。

服务器当前正在运行带有安全修复程序 (11.0.5343.0) 的 SP2,即使在集群故障转移之后,TempDB 的使用似乎仍然存在。我们没有尝试重新启动,因为这是一个生产系统,但我认为故障转移会产生相同的效果。

以前有没有人遇到过这个问题,如果有,你是怎么解决的?

谢谢,

sql-server database-internals service-broker sql-server-2012 tempdb

5
推荐指数
1
解决办法
454
查看次数

SQL 未使用的登录名

有没有办法找出过去 90 天内未登录 SQL Server 或访问数据库的登录名?

sql-server maintenance sql-server-2012

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

在 SQL Server Management Studio 中读取 CSV 并执行 SQL

是否可以在 SQL Server Management Studio 中读取 CSV 并每行执行 SQL 更新?

例子

数据.csv

"column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3" "column1","column2,"column3"

我想根据每行中的数据运行 SQL 更新,例如

UPDATE [data].[orders] set order_number = $column1, something_else = $column2 where order = $column3

这可以在 SQL Server Management Studio 中完成吗?

sql-server-2012 csv

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

改变表开关

我有两列要从计算转换为非计算。我有代码。但是,有人建议我使用 ALTER TABLE SWITCH。我相信建议它的人不想让数据库停机。我想他们想要这样的东西 1)创建新文件组 2)创建新的重复表,它在新文件组上有计算列 3)将计算列更改为非计算列 4)切换数据库以使用这个新文件组/表 5) 删除带有计算列的旧文件组/表

但是,当我研究 ALTER TABLE SWITCH 命令时,在我看来,这种情况不是它的正确用法。

有没有办法使用 ALTER TABLE SWITCH 将计算列更改为非计算列?

sql-server-2012

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

在同一个可用性组中拥有多个数据库与每个数据库具有单个 AG 相比有什么好处

我们正在计划从当前的镜像架构迁移到多个数据库的可用性组。对于每个数据库,我们都定义了主要/次要副本配置。

我不确定的问题是:我们是否需要将具有相同主要/次要配置的数据库分组到同一个 AG 中,还是每个数据库使用一个 AG。拥有多个数据库的单个 AG 与 AG 的优缺点是什么?是否有最佳实践来确定数据库是否需要自己的 AG 或可以与其他数据库结合使用?任何性能或故障转移优势?

sql-server-2012 availability-groups

5
推荐指数
1
解决办法
1407
查看次数

强制 SQL Server 解析“DDMMYYYY”

我正在从一个文件开发 ETL,其中日期以“DDMMYYYY”格式表示,例如“31012016”。

我想获取这个字符串并将它直接传递给将插入数据的 SQL 文本。我不想将它解析为 C# DateTime 然后将其格式化为“YYYY-MM-DD”,以便 SQL Server 再次解析它。

正如我目前所做的那样,日期字符串由 .Net 解析一次,然后由 .Net 格式化并打印在 SQL 代码中,然后由 SQL Server 再次解析。我想从平面文件中获取字符串并将其直接放入 SQL 代码中,无需任何转换。

SQL Server 识别“YYYYMMDD”,但“DDMMYYYY”失败并显示消息:

从字符串转换日期和/或时间时转换失败。

例子:

DECLARE @datevar date = PARSE('31012016' as date using 'pt-BR');  
SELECT @datevar; 
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作?

我试过了,PARSE('31012016' as date using 'pt-BR')但引发了异常。TRY_PARSE返回空值。还尝试了CAST 和 CONVERT (Transact-SQL)但似乎不存在这种风格。

sql-server date-format sql-server-2012

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