小编Shi*_*iva的帖子

将 SQL Server 中的兼容模式从 100 更改为 110 的影响

我有一个Mydatabase在 SQL Server 2008 R2 中创建的数据库。我已经升级到 SQL Server 2012。

我试图执行以下查询来计算百分位数

select Distinct [KEY],PERCENTILE_CONT(0.25)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q1,PERCENTILE_CONT(0.50)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q2,
PERCENTILE_CONT(0.75)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q3,
PERCENTILE_CONT(1)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q4
from Mydatabase
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误说明

消息 10762,级别 15,状态 1,第 1 行
当前兼容模式下不允许使用 PERCENTILE_CONT 函数。仅允许在 110 模式或更高模式下使用。

  1. 我可以将兼容模式更改为 110 吗?
  2. 将兼容模式从 100 更改为 110 有什么影响?

请指教

sql-server-2012 compatibility-level

19
推荐指数
3
解决办法
4万
查看次数

为什么 varchar 数据类型允许 unicode 值?

我有一个带有 varchar 列的表。它允许使用商标 (™)、版权 (©) 和其他 Unicode 字符,如下所示。

Create table VarcharUnicodeCheck
(
col1 varchar(100)
)

insert into VarcharUnicodeCheck (col1) values ('MyCompany')
insert into VarcharUnicodeCheck (col1) values ('MyCompany™')
insert into VarcharUnicodeCheck (col1) values ('MyCompany?')
insert into VarcharUnicodeCheck (col1) values ('MyCompanyï')
insert into VarcharUnicodeCheck (col1) values ('MyCompany')

select * from VarcharUnicodeCheck
Run Code Online (Sandbox Code Playgroud)

但是varchar定义说,它允许非 unicode 字符串数据。但 Trademark(™) 和 Registered(®) 符号是Unicode字符。定义是否与 varchar 数据类型的属性相矛盾?我阅读了几个链接,例如第一个第二个。但是我仍然不明白为什么当定义说它只允许非 unicode 字符串值时它允许 unicode 字符串。

sql-server datatypes character-set encoding unicode

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

SQL Server:链接服务器中的频繁登录超时过期

我正在使用 SQL Server 2012。我安排了一个作业每 1 小时运行一次,其中 1 个步骤调用 1 个简单的存储过程。存储过程将大约 1K 数据从生产服务器迁移到我们的本地服务器。已成功建立链接服务器。存储过程中使用的查询如下所示。

SELECT ID,Col1,Col2,Col3,Col4,Col5 into #temp from [111.111.111.111].ProdServer.dbo.SourceTable

Insert into Localtable(ID,Col1,Col2,Col3,Col4,Col5)
SELECT ID,Col1,Col2,Col3,Col4,Col5
FROM #temp where ID NOT IN (select ID from Localtable)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

作业执行有时需要 25-30 秒才能成功执行。有时需要 48-50 秒导致失败。请参阅下面的失败消息和上面屏幕截图中的其他详细信息。

失败信息:

以用户身份执行:NT AUTHORITY\NETWORK SERVICE。命名管道提供程序:无法打开与 SQL Server [53] 的连接。[SQLSTATE 42000](错误 53)链接服务器“111.111.111.111”的 OLE DB 访问接口“SQLNCLI10”返回消息“登录超时已过期”。[SQLSTATE 01000](错误 7412)链接服务器“111.111.111.111”的 OLE DB 访问接口“SQLNCLI10”返回消息“与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。服务器未找到或未找到可访问。检查实例名称是否正确,以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。”。[SQLSTATE 01000](错误 7412)。步骤失败。

更多细节

  • 该表被任何人锁定,并且没有在其上运行任何查询。
  • 在链接服务器属性中,查询超时和连接超时都设置为 0。
  • 在服务器属性远程查询超时也设置为 600 秒。

作为最后一个选项,我尝试将连接超时设置从默认值 15 更改为 6000 …

sql-server linked-server jobs

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

SQL Server:在创建新数据库时创建默认存储过程

我正在使用 SQL Server 2008 R2。我需要在默认情况下创建一个简单的存储过程,当在 SQL Server 中创建新数据库时。我怎样才能做到这一点?假设要创建的存储过程是

CREATE PROCEDURE [dbo].[Default_SP]
AS
BEGIN
    SELECT GETDATE()
END
Run Code Online (Sandbox Code Playgroud)

触发器可以应用于表级别。但这是在数据库创建事件上。我在网上搜索,我找不到答案。

sql-server sql-server-2008-r2

7
推荐指数
1
解决办法
801
查看次数

SQL Server:递归动态 SQL 难题

我正在看这篇关于trim all columns of a table 的帖子。在答案查询脚本中,列名被连接起来,没有任何循环操作。我简化了它以检查其工作流程,如下所述。

  • 创建一个新的数据库

  • 创建一个包含三列的新表,如下面的脚本所示。(不需要插入值)

    Create table table1(id int, name varchar(20), city varchar(20))
    
    Run Code Online (Sandbox Code Playgroud)

    在 T-SQL 脚本下面执行,结果xxx [id] [name] [city] 是单行。

    Declare @a as varchar(4000)
    SET @a = 'xxx '
    SELECT @a = @a + '['+COLUMN_NAME+'] ' FROM INFORMATION_SCHEMA.COLUMNS 
    SELECT @a
    
    Run Code Online (Sandbox Code Playgroud)

以下脚本导致 3 行

Declare @a as varchar(4000)
SET @a = 'xxx '
SELECT 'b' = @a + '['+COLUMN_NAME+'] ' FROM INFORMATION_SCHEMA.COLUMNS 
Run Code Online (Sandbox Code Playgroud)

为了更好地理解,我使用Top 1. 这结果xxx [id]

Declare @a as varchar(4000)
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql

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

即使与另一个列值部分匹配,也将特定字符串替换为空白

我有一个场景,如果部分单词与另一列匹配,则从一组逗号分隔的字符串中替换整个字符串。

我发现用文字解释非常复杂,因此我通过包含各种示例的屏幕截图进行了解释。

请帮助我使用存储过程或函数或查询来获取所需结果列中的结果,如下面的屏幕截图所示。

截屏

我尝试使用STRING_SPLIT函数来分割值并连接表。我对解决这个问题的逻辑感到震惊。

sql-server string-manipulation

0
推荐指数
1
解决办法
207
查看次数