小编Sol*_*zky的帖子

SQL Server 有 Date_Format 函数吗?

我发现的只是一个DateFormat我可以选择的预定义列表,就像这样

我记得在 MySQL(还有 PostgeSQL?)你可以定义你的日期格式:

DATE_FORMAT(now(),'&m_%Y') --for 02_2012 etc.
Run Code Online (Sandbox Code Playgroud)

SQL Server 有同样的东西吗?我看到人们必须编写一个函数来做这样的事情,它有内置的吗?


编辑:

我刚刚找到了这个DatePart功能。它可以以月份为数字,但总是返回 1 位数字,即使我使用 datePart(MM, getdate())

sql-server-2005 sql-server date-format datetime

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

IF 语句在使用 sp_MSForEachDB 循环数据库时不跳过 TempDB

[SQL Server 2012 SP2 EE]

为什么以下脚本给我一个与 tempdb 相关的错误?

    exec sp_MSForEachDB '
    IF ( (select database_id from sys.databases where name = ''?'') > 4)
    BEGIN 
    ALTER AUTHORIZATION ON DATABASE::? TO [sa];
    ALTER DATABASE [?] SET RECOVERY SIMPLE;
    END'
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

  Msg 5058, Level 16, State 1, Line 5
  Option 'RECOVERY' cannot be set in database 'tempdb'.
Run Code Online (Sandbox Code Playgroud)

它完成了它应该做的工作。但我想不出错误的原因。我知道 tempdb 的 databaseID 是 2,那么至少它不应该尝试为 tempdb 设置选项。

sql-server sql-server-2012 tempdb

8
推荐指数
1
解决办法
624
查看次数

如何命名表变量函数唯一约束?

我正在重命名一些独特的约束以匹配我们的数据库对象命名约定。奇怪的是,有几个多行表值函数返回的表具有唯一约束,如下所示:

CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result 
TABLE
(
    ID BIGINT PRIMARY KEY,
    ...
    RowNum BIGINT UNIQUE 
)
BEGIN
    ...
    RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)

我尝试这样命名它,但不起作用:

CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result 
TABLE
(
    ID BIGINT PRIMARY KEY,
    ...
    RowNum BIGINT
    ,CONSTRAINT UC_fn_name_RowNum UNIQUE([RowNum])  
)
BEGIN
    ...
    RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)

当它是表变量函数定义的一部分时,是否可以设置唯一约束的名称?

t-sql sql-server-2012 set-returning-functions unique-constraint table-variable

8
推荐指数
1
解决办法
1216
查看次数

查看 XML 元素是否存在于具有特定值的文档中的任何级别

是否可以查询 XML 以查找特定元素是否具有特定值?例如,如果我想查看下面的 XML 在<ContactFName>.

但请注意,元素的位置可能会改变。在某些情况下,它可能在/root/MCTLocations/MCTLocation,或者可能跳到根下,或者出现在其他地方......

并且,是否可以参数化元素名称?

DECLARE @table TABLE (XmlCol XML)

INSERT INTO @table (XmlCol) VALUES ('
<root>
<MCTClientName>John</MCTClientName>
<MCTClientCity>Palm Beach</MCTClientCity>
<MCTLocations>
    <MCTLocation>
        <Address>1234 Main Street</Address>
        <ContactFName>Chris</ContactFName>
        <ContactLName>Brandt</ContactLName>
    </MCTLocation>
</MCTLocations>
</root>')

SELECT * FROM @table WHERE ??
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql

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

如何检查数据库主密钥加密是否有效?

我有一个场景,我将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,行中sys.key_encryptions仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 进行了加密?

sql-server encryption

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

如果存储过程在 TRY / CATCH 中失败,则未设置输出参数

在 SQL Server 2008 中(但也在 2014 年)。让我们考虑一个具有输出参数的过程。此过程可能会产生错误(并且会在以下示例中产生)。我注意到如果我们在TRY/CATCH块中调用过程,输出参数的行为是不一样的。

例子:

create procedure test_output @result varchar(10) output
as
begin
    set @result = 'hello'
    raiserror('This is an error', 16,1)
    set @result = 'error'
end
Run Code Online (Sandbox Code Playgroud)

如果我们以简单的方式启动程序:

declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
Run Code Online (Sandbox Code Playgroud)

我们得到(我很好):

Msg 50000, Level 16, State 1, Procedure test_output, Line 7 [Batch Start Line 12]
这是一个错误
结果是:错误

如果过程现在在 try/catch 块中:

declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
    exec test_output …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql parameter error-handling

8
推荐指数
1
解决办法
4120
查看次数

使用 INSERT INTO...EXEC AT 链接服务器进入临时表失败并显示消息 7391

我正在使用 SQL Server 2014。我想执行EXEC (@remotecmd) AT [server_name];(@remotecmd 是动态 sql 而不是存储过程)到##eapb. 我的代码是

insert into ##eapb
EXEC (@remotecmd) AT [ADSQLDB3S\DEV];
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

链接服务器“server_name”的 OLE DB 访问接口“SQLNCLI11”返回消息“事务管理器已禁用对远程/网络事务的支持。”。
    消息 7391,级别 16,状态 2,第 71 行
    由于链接服务器“server_name”的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务,因此无法执行该操作。

如果我删除insert into ##eapb,我没有错误。

链接服务器的RPC Out选项设置为True

sql-server dynamic-sql t-sql linked-server temporary-tables

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

存储过程可以引用存储它的数据库吗?

假设我在多个数据库中复制了一个存储过程,并进行了一些修改。而且我想引用存储过程所在的数据库,即使它是在另一个数据库中执行的。

有没有办法检索完整路径 (..) 或以其他方式检索存储过程所在的数据库,而不是当前数据库?

sql-server stored-procedures

8
推荐指数
1
解决办法
2342
查看次数

行计数显示在对象资源管理器详细信息上所需的权限

我有一个奇怪的安全问题。我有一个用户在 SQL 2016 服务器上使用 SSMS 18.2。他们是 db_datareader 的成员,但是当他们在 Object Explorer Details 中拉出Row Count列时,它是空白的。尽我所知,它需要 DBO 才能显示行数。

具有读取权限的用户: 在此处输入图片说明

具有 dbo 访问权限的用户: 在此处输入图片说明

这是一个错误还是故意的?有谁知道是否有较低级别的权限可以提供此行数?我知道有很多其他方法可以获得行数,例如sys.partitions,但是用户坚持认为他们想要使用 OED 窗口。

sql-server permissions ssms sql-server-2016

8
推荐指数
1
解决办法
249
查看次数

是否可以在没有完整还原的情况下确定数据库的默认排序规则和服务器版本?

我在一家公司工作,该公司定期从客户那里接收大型 SQL 数据库备份以用于支持目的。我们支持多个 SQL 版本和排序规则,但目前必须手动确认我们客户端的 SQL 版本,然后才能恢复到正确的 SQL 实例。我想知道是否有办法自动化这个过程。

我期待:

  1. 查找备份数据库的 SQL Server 版本(我们得到 2008 R2 以及 2014 和 2017)
  2. 查找数据库的默认排序规则

无需完全恢复到可能不正确的 SQL 实例,由于其大小,这需要大量时间。(也许是零碎的恢复?)

sql-server backup collation instance restore

8
推荐指数
1
解决办法
642
查看次数