标签: sql-server

选择合适的数据类型时的时区注意事项

我们目前正在为我们的定制应用程序开发一个任务管理系统。经过深思熟虑,我们得出的结论是,我们只需要用户指定任务的截止日期。

我想知道当英国的用户添加任务并且圣彼得堡的用户看到它时它会如何工作,考虑到圣彼得堡比英国早至少 2 小时。

假设英国的用户创建了一个 20/Apr/2018 到期的任务。4 月 19 日 23:30(英国时间),圣彼得堡的一位用户打开了任务。但是,由于在圣彼得堡已经是 20/Apr,看起来任务已经完成,但实际上还没有安排运行。

如果日期字段实际上是 type date,我很确定圣彼得堡的用户会看到标记为过期的任务,因为他结束时已经是 20/Apr。

我见过其他几个任务工具,而且几乎所有工具都只允许任务的截止日期(而不是时间)。然而,我想知道其他系统如何处理此类问题,或者他们是否根本不打扰。

所以客观地回答我的问题:

  • 我们承认这种差异并接受它。如果任务将于 4 月 20 日到期,并且在澳大利亚已经是 4 月 20 日,但在加利福尼亚州尚未到期,我们只接受澳大利亚用户将任务视为迟到而加利福尼亚用户将其视为“进行中”。
  • 我认为解决这个问题的唯一方法是在datetime字段中捕获日期(即使我们不允许用户输入时间),然后还允许定义时区。

我错过了什么吗?

编辑:为了回答有关我们是否希望任务的截止日期遵循查看任务的用户的时区或创建任务时的固定时区的问题,我们选择了固定时区。因此,任务将设置为英国时间 20/Apr 到期,只有在英国时间达到 YYYY-04-20 00:00:00.00 时才会到期。

为了支持这一点,我们将允许用户在创建任务时单击截止日期字段旁边的小图标,允许他们选择时区。时区将根据以下工作流程设置为默认值:

时区计算工作流程

我们将为用户的帐户页面创建两个设置,允许用户:

  • a) 切换应用程序的选项以尝试从客户端自动获取其时区。

  • b) 让他们选择默认时区的选项。

基于这个要求,我们几乎可以得出结论,date数据类型是不可能的。现在对我来说不是 100% 清楚的是我们应该选择 a datetime2(我总是使用datetime2而不是datetime)还是 a datetimeoffset。

sql-server datetime date

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

动态端口被设置为不同的端口

在我们的 SQL Server 实例之一(如果您确实需要知道,则为 12.0.5571.0)上,我们使用多个 IP 地址进行连接。

  • 127.0.0.1 - 动态端口设置为 0。没有设置静态端口
  • 172.16.0.5 - SQL Server 所在服务器的 IP 地址。动态端口设置为 0(自动生成)。未分配静态端口
  • 172.16.0.6 - SQL Server 实例的 IP 地址(这样团队只需要点击 IP 地址而不知道他们真正在哪个服务器上)。未分配动态端口。静态端口 1433

我一直在玩 puppet 并且一直在搞乱注册表设置

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp
Run Code Online (Sandbox Code Playgroud)

看看我是否可以使用 puppet 来自动配置 IP 地址和端口分配。我创建了一个名为“IP172016000006”的新注册表路径

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp\IP172016000006
Run Code Online (Sandbox Code Playgroud)

我从中模板化

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.InstanceNameX\MSSQLServer\SuperSocketNetLib\Tcp\IP1
Run Code Online (Sandbox Code Playgroud)

但是现在每当我启动 SQL Server 实例时,127.0.0.1 和 172.16.0.5 的动态端口都不同。

比如我会停止SQL Server的实例,进入

  • “SQL Server 配置管理器”
    • 导航到实例的网络配置
      • tcp/ip
        • IP地址
          • 并为 IP 地址 127.0.0.1 和 172.16.0.5 设置“TCP 动态端口 = 0”。

重新启动 SQL Server 后,该实例将侦听 127.0.0.1:43340 和 172.16.0.5:43341(似乎总是比另一个端口多 1) …

sql-server network sql-server-2014

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

PIVOT、Row_Number() 返回多行

我试图将电子邮件列表旋转到一行上,但由于某种原因,我的主要电子邮件地址得到了自己的一行,所以我最终每个联系人有两行。

CREATE TABLE #tmp (
ID VARCHAR(20)
, EMAIL VARCHAR(50)
, isPrimary VARCHAR(1)
)

INSERT INTO #tmp (ID, EMAIL, isPrimary) VALUES ('B4100358183Q!ZH.ETES', 'ABoyd@Energize.com', '1')
INSERT INTO #tmp (ID, EMAIL, isPrimary) VALUES ('B4100358183Q!ZH.ETES', 'BSykes@Energize.com', '0')
INSERT INTO #tmp (ID, EMAIL, isPrimary) VALUES ('B4100358183Q!ZH.ETES', 'TC6@test.com', '0')
Run Code Online (Sandbox Code Playgroud)

我如何修改下面的脚本以仅返回包含所有 3 个电子邮件地址的一行而不是两行?

SELECT ID, [1], [2], [3]
FROM (
  Select ID, EMAIL, isPrimary 
  , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY isPrimary desc) AS rn
  from #tmp
) eml
PIVOT (
  min(EMAIL)
  FOR rn IN …
Run Code Online (Sandbox Code Playgroud)

sql-server pivot

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

如何仅在良好的情况下恢复 .bak

我正在使用 Tsql 脚本来恢复多个数据库。

RESTORE DATABASE XXX_M
   FROM DISK = 'C:\XXX.bak'
   WITH FILE = 1, replace
GO
Run Code Online (Sandbox Code Playgroud)

有时 .bak 文件已损坏(不是数据损坏)。

我想知道是否有一种方法可以检查文件是否未损坏,然后进行恢复,否则不会。我尝试在恢复验证后使用@@rowcount,但效果不好。

RESTORE VERIFYONLY 
   FROM DISK = 'C:\xxx.bak'
if @@ROWCOUNT !=0
print 'false'
else 
print 'good'
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

谢谢。

sql-server-2008 sql-server t-sql sql-server-2008-r2 sql-server-2014

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

SQL Server 在日志备份中的哪个点截断日志文件?

我正在调查一个问题,即我们的第三方备份软件在工作日期间开始对我们的某些数据库进行完整备份的时间有些可预测。它启动日志备份,检测 LSN 中的断链,然后将其转换为完整备份。

我检查过,没有针对我们遇到的 SQL 服务器运行其他日志备份。

发生的情况是日志备份按计划开始,但有时在备份期间与备份服务器的连接丢失。该作业处于不确定状态,当它以相同的作业 ID 重新启动时,会检测到一条断开的链,并开始对受影响的数据库进行完整备份。

搜索日志,我可以看到备份失败和备份使用不再存在的相同 LSN 重新启动。

所以我的问题是,当使用 truncate 选项进行日志备份时,SQL Server 是在备份日志时还是在成功完成作业时截断日志?在我的情况下,似乎正在备份一系列 LSN,标记为已备份,当作业失败时,它会在作业重新启动时再次查找相同的 LSN。

sql-server

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

使用加密列复制,第二台服务器是否必须具有相同的主密钥和对称密钥,还是自动完成?

我实际上有两个问题:

如果您设置一个带有加密列的表并将其复制到另一台服务器,另一台服务器是否必须具有相同的主密钥和对称密钥,还是自动复制?

复制活动记录在哪里?- 是在windows 事件查看器里面吗?

replication sql-server logging

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

如果值为 null 或为空,则不要在字符串前添加逗号

如果我的结果为空或空,我希望它不要在字符串前添加逗号。我怎样才能做到这一点?

  Update Companies 
    set address4 = concat(address4,','+ t.Eircode) 
    From companies c
    Inner Join Temptbl1 t
    on c.comp_id = t.Comp_ID
    OR address4 = ''
Run Code Online (Sandbox Code Playgroud)

更新 :

只是为了在我进行此更新时说清楚

   ,V05 TTX1 
    Waterford,X01 B234
    ,B90 E902
    Co Wexford,TD2 PVE2
Run Code Online (Sandbox Code Playgroud)

不管它是否为空,它都会添加一个逗号

我想找回的是:

    V05 TTX1 
    Waterford,X01 B234
    B90 E902
    Co Wexford,TD2 PVE2
Run Code Online (Sandbox Code Playgroud)

如果没有值,则只需添加不带逗号的字符串,在我们的例子中V05 TTX1不带,在字符串的开头

CREATE TABLE [dbo].[companies](
    [comp_id] [int] NOT NULL,
    [address4] [varchar](32) NOT NULL
)


INSERT INTO [dbo].[companies]
           ([comp_id]
            ,[address4])
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

数据库图表的脚本创建

是否可以使用 T-SQL 编写数据库图表的创建脚本?

如果不是,当您使用数据库图表设计器保存/编辑图表时(它是使用 PowerShell 还是其他某种语言来保存和加载这些类型的对象),它在做什么?

我问是因为我希望自动创建数据库图表。我有一个我的开发人员编写的工具(在 C# 中),它根据它对我们供应商数据所做的一些 Web 服务调用的响应自动创建表及其外键关系。

sql-server t-sql database-diagrams

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

在存储过程中使用临时表的最佳实践

我最近开发了一个存储过程,它基本上从几个不同的表中查询数据,对其进行操作,然后将结果插入到某个表中。

它最终成为一个包含许多子查询的 INSERT 语句,大约有 300 行。代码非常高效;但是,它的可读性不是很好,并且可能还有其他缺点。

编写这样的查询是否在推荐用法内:

SELECT ...
INTO #tempfoo
FROM foo;

SELECT ...
INTO #tempbar
FROM bar;

SELECT ...
FROM #tempfoo
     INNER JOIN #tempbar ON #tempfoo.id = #tempbar.id;
Run Code Online (Sandbox Code Playgroud)

或者像这样写更好,即使它可能变得有些不可读:

SELECT ...
FROM
(
    SELECT ...
    FROM foo
) AS foo
INNER JOIN
(
    SELECT ...
    FROM bar
) AS bar ON foo.id = bar.id;
Run Code Online (Sandbox Code Playgroud)

注意:我知道这是一个简单的例子,但想象一下,如果您有嵌套子查询层和四个或更多表连接。

sql-server best-practices

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

如果添加另一个行数据文件,SQL Server 开始移动数据的速度有多快?

我们的 sql server 迁移被延迟(自然地),并且在新的切换日期之前它将用完空间。为了保持数据库正常运行,我需要给它另一个数据库文件来开始写入。

我已经分配了空间并准备好了,但是当我创建它时,SQL Server 会立即开始将数据移动到新文件中吗?

问题:我最好创建两个新文件,然后运行

    dbcc shrinkfile (livendb, emptyfile)
Run Code Online (Sandbox Code Playgroud)

在旧的?确保他们立即变得平等?

sql-server

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