标签: t-sql

如何将默认数据库更改为所有登录名?

我对 SQL Server 有点陌生,我正在尝试编写 Microsoft SQL Server (2005-2014) 安装后活动的脚本,但我在更改登录时遇到了一些困难。公司政策规定没有登录应该默认使用 master 数据库,因此我的计划是识别所有默认使用 master 的登录并将 master 更改为 tempdb。

可以使用这样的查询更改单次登录:

ALTER LOGIN [sa] WITH DEFAULT_DATABASE = tempdb
Run Code Online (Sandbox Code Playgroud)

试图在所有登录中实现这一点(不知道它们的数量和名称),我知道我很天真,希望这样的事情会起作用(但不得不尝试):

UPDATE master..syslogins
SET dbname = 'tempdb'
WHERE dbname = 'master'
Run Code Online (Sandbox Code Playgroud)

显然输出是一个错误(逻辑上):

Ad hoc updates to system catalogs are not allowed.

SQL Server 处于 MIX 身份验证模式,因此几乎所有内容都可以登录 - SQL 登录、Windows 本地或域用户或组(不确定这是否会对解决方案产生任何影响)。解决方案应该与版本无关,但是假设从 SQL Server 2005 向前启动(...是的,仍然有一些古老的版本...)

任何人都可以帮我找到合适的查询来实现这一目标吗?

sql-server t-sql logins

6
推荐指数
1
解决办法
7221
查看次数

合并来自多行的数据

我在处理查询时相对较新,所以让我提前道歉。这是我将使用的 SQL Server 2012。这些数据已通过每晚从 Excel 导入的方式导入临时表。我需要将此数据从该表移动到我们的主硬件表中,并确保在检查时插入任何新数据以确保它更新任何旧数据。我会提供尽可能多的信息,请耐心等待。

字段名称是:

|Ticket_Num | Name | Worker | date1 | Serial | Part | Description1 | Type1 | Eqmt_Type |
Run Code Online (Sandbox Code Playgroud)

我需要将它们带入具有以下内容的表中:

   |Event_NUM|Name|Install_Date|Pull_Date|Install_Tech|Pull_Tech| PMP1_Desc|PMP1_Part|PMP1_Serial|PMP2_Desc|PMP2_Part|PMP2_Serial|PMP3_Desc|PMP3_Part|PMP3_Serial|Motor1_Desc|Motor1_Serial|Motor1_Part|Motor2_Desc| Motor2_Serial| Cab1_Disc|Cab1_Part|Cab1_Serial|Cab2_Desc|Cab2_Part|Cab2_Serial|Dis1_Desc|Dis1_Part|Dis1_Serial|Dis2_Desc|Dis2_Part|Disc2_Serial|
Run Code Online (Sandbox Code Playgroud)

这是 SQL Fiddle 的示例,其中包含从 Excel 中提取的数据: SQL Fiddle for data to be insert

这是 SQL Fiddle 和我想要的示例:SQL Fiddle example of what I would like

pivot t-sql sql-server-2012

6
推荐指数
1
解决办法
144
查看次数

按日期分组时甚至返回空组

我有以下查询:

SELECT DISTINCT
           COUNT(CD_BarCode)
           ,CD_Carrier
           ,SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11) Date
FROM TB_AGIL 
WHERE 
           DT_Arriving >= @date
           AND DT_Arriving < DATEADD(MONTH,+1,@date)
           AND CD_TRACKING = 14
GROUP BY CD_Carrier, SUBSTRING(CONVERT(VARCHAR,DT_Arriving,103),1,11)
ORDER BY Date 
Run Code Online (Sandbox Code Playgroud)

我用它来查看上个月货物移动的结果。结果是按日期分组的cd_tracking金额列表,如下所示:

| Amount | Carrier |    Date    |
|--------|---------|------------|
|  2599  |   44    | 01/08/2015 |
|  2504  |   44    | 03/08/2015 |
|  4597  |   44    | 04/08/2015 |
|  5058  |   44    | 05/08/2015 |
|  2413  |   44    | 06/08/2015 |
|  4853  |   44    | 07/08/2015 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql group-by

6
推荐指数
1
解决办法
7276
查看次数

将 CHAR 转换为 DATETIME 以便我可以使用 DATEADD()

我有一个关于将DATEADD()函数用于标识为的列的问题CHAR (6)

time_stamp列包含类似131329as 的值hhmmss。每当我尝试创建一个新列来保存列的值time_stamp+ 5 分钟时,我都会收到错误消息。

消息 242,级别 16,状态 3,第 1 行
字符数据类型到日期时间数据类型的转换导致日期时间值超出范围。`

我想要做的是创建一个新列,它比time_stamp. 我现在正在处理一份显示“已完成订单”的报告,但我需要该报告将订单显示为“未完成”至少 5 分钟,然后才能在报告中显示为“已完成”。

sql-server t-sql type-conversion datetime

6
推荐指数
1
解决办法
1000
查看次数

将结果导出到 XML

我正在尝试从 SQL 查询创建 XML 文件。输出应如下图所示

在此处输入图片说明

标签BranchID再次出现的地方,SubParentBranchID好像有多个SubBranchIDBranchID. 在下图中,BranchID94 有两个SubBranchID63 和 64。

我管理了这个 SQL 查询

SELECT
a.[heading_id] as BranchID,
c.[name] as BranchName,
a.[business_id] as SubBranchID, 
a.[heading_id] as SubParentBranchID,
b.[name] as SubBranchName
   FROM [BUSINESSHEADINGLINK] as a
   join [BUSINESS] as b on a.business_id = b.business_id
   join [HEADING] as c on   a.heading_id = c.heading_id 
FOR XML PATH ('Branch'), ROOT('BranchInfo')
Run Code Online (Sandbox Code Playgroud)

这给了我以下 XML

在此处输入图片说明

在这里你可以看到我既没有标签<SubBranches>也没有<SubBranch>. 我也没有<SubParentBranchID>。XML 文件应如下所示:

在此处输入图片说明

任何人都可以帮助我使用 SQL 代码吗? …

xml sql-server t-sql

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

如何在 AFTER UPDATE 触发器中仅引用受影响的行

我有这张桌子:

在此处输入图片说明

我正在尝试创建一个更新触发器,每当对or列执行更新时,该触发器就会更新last_updated_on = GETDATE()last_updated_by = SYSTEM_USER列。step_numberstep_name

我开始创建它

ALTER TRIGGER tr_app_bread_crumbs_afterupdate
ON [dbo].[app_bread_crumbs]
AFTER UPDATE
AS
BEGIN 
    UPDATE [dbo].[app_bread_crumbs]
    SET last_updated_by = SYSTEM_USER,
    last_updated_on = GETDATE()
END
Run Code Online (Sandbox Code Playgroud)

但这将一次更新所有行。我正在尝试弄清楚如何指定仅更新last_updated_onlast_updated_by由正在更新的特定行的触发器。

例如,如果他们更新:

UPDATE [dbo].[app_bread_crumbs]
    SET step_name = 'DAMAGE' WHERE step_number = 1
Run Code Online (Sandbox Code Playgroud)

触发器应该只更新第一行

trigger sql-server t-sql sql-server-2012 row-modification-time

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

是否有任何理由避免使用 sp_rename 重命名对象?

文档中明确指出:

更改对象名称的任何部分都可能破坏脚本和存储过程。我们建议您不要使用此语句重命名存储过程、触发器、用户定义函数或视图;相反,删除对象并使用新名称重新创建它。

重命名怎么样:

  • 主键
  • 唯一键
  • 外键
  • 默认约束
  • 索引

我将重命名上述所有对象以匹配我们的内部命名约定,但我想为此编写一个自动脚本(因为有数千个约束)。

我能想到的唯一问题是,如果索引与hintin 语句一起使用,它将被破坏。

您能说出任何其他不将sp_rename用于此类目的的原因吗?

sql-server t-sql sql-server-2012 sql-server-2014

6
推荐指数
1
解决办法
2680
查看次数

是否可以将证书添加到数据库角色?

我有一个证书,用于对 SQL Server 中的存储过程进行 DB 间访问,并且能够通过使用以下方法在数据库中创建新用户来提供对存储过程的访问:

CREATE CERTIFICATE testCertificate
FROM FILE = 'test_certificate6.cer';

CREATE USER testCertificateUser 
FROM CERTIFICATE testCertificate;

GRANT AUTHENTICATE TO testCertificateUser;
GRANT EXECUTE ON storedProc1 TO testCertificateUser;
Run Code Online (Sandbox Code Playgroud)

但需要能够将跨数据库访问添加到现有数据库角色(为了与现有系统兼容)。我该怎么做呢?

sql-server t-sql signature certificate

6
推荐指数
1
解决办法
544
查看次数

获取 MSSQL Server 命名实例上的数据库大小

我需要获取 SQL 服务器迁移项目的数据库大小列表。我们要迁移的 SQL Server 服务器安装了三个实例,一个是默认实例,两个是命名实例。如果重要的话,它在 Server 2008 R2 上运行 SQL Server 2008 R2。

为了得到这个列表,我删除了我在上一个职位上作为事实上/意外 DBA 使用的旧 T-SQL“脚本”,它在默认实例上按预期工作,但没有返回任何一个命名实例的数据。

SELECT [Database Name] = DB_NAME(database_id),

   [Type] = CASE WHEN Type_Desc = 'ROWS' THEN 'Data File(s)'

                 WHEN Type_Desc = 'LOG'  THEN 'Log File(s)'

                 ELSE Type_Desc END,

   [Size in MB] = CAST( ((SUM(Size)* 8) / 1024.0) AS DECIMAL(18,2) )

FROM   sys.master_files

GROUP BY      GROUPING SETS

          (

                 (DB_NAME(database_id), Type_Desc),

                 (DB_NAME(database_id))

          )

ORDER BY      DB_NAME(database_id), Type_Desc DESC

GO
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我原因(以及如何解决),或提出更好的解决方案吗?

(它一定是FROM sys.master_files一点,因为它还能是什么,但我不确定我应该在命名实例上使用什么。)

编辑:下面是我在我的命名实例上看到的内容,无论如何......所以如果这段代码确实/应该适用于命名实例,那么关于它为什么不适用于这些实例的想法将不胜感激。

截图

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

6
推荐指数
1
解决办法
1602
查看次数

如何查找具有多个连续大写字符的值

对于我正在处理的项目,我需要识别大写不正确的值。

例如,我需要它来识别以下类型的值:

Mr JOHN Smith
MR John Smith
Mr John SMITH
Mr JOhn Smith
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的想法:

Select * from table where Name = upper(Name) 
  collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

(它给出了全部大写的行的结果,例如 MR JOHN SMITH)

Select * from table where right(Name,3) = upper(right(Name,3)) 
  collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

它也拾取了一些行。

但我怀疑这是解决此问题的最有效方法。

sql-server collation t-sql sql-server-2014 unicode

6
推荐指数
1
解决办法
3632
查看次数