标签: sql-server

SQL Server - NTEXT 列和字符串操作

我有一个表,其中有一NTEXT列名为comments. 我有第二个字符串,我们称之为anothercomment(a varchar),它需要放在comments单词 之后的给定字符串中UPDATEHERE。

强制转换会nvarchar(max)截断comments字符串,因此我不能使用CHARINDEX()( Msg 8152, Level 16, State 10, Line 2 String or binary data would be truncated.)。我曾经datalength()检查过是否有几千列 > 8000 个字符。

我想要实现的示例(尽管字符串更长):

注释 - This is a test UPDATEHERE This is the end of the test

另一个评论—— . This is inserted.

结果字符串 - This is a test UPDATEHERE. This is inserted. This is the end of the test …

sql-server sql-server-2008-r2 string

11
推荐指数
2
解决办法
7550
查看次数

为什么 COUNT() 为“NULL”聚合返回 0?

SELECT 语句返回几行:

SELECT
  ColA
FROM
  TableA
WHERE
  ColA IS NULL
Run Code Online (Sandbox Code Playgroud)

我在 TableA 中得到 47 行的 ColA 为“NULL”。

ColA
NULL
NULL
NULL
etc...
Run Code Online (Sandbox Code Playgroud)

如果我向这个查询添加一个聚合:

SELECT
  ColA,
  COUNT(ColA) AS theCount
FROM
  TableA
WHERE
  ColA IS NULL
GROUP BY ColA
Run Code Online (Sandbox Code Playgroud)

我得到

ColA | theCount
NULL | 0
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该怎么做才能避免这种情况?

null sql-server aggregate

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

无法继续执行,因为会话处于终止状态。在构建聚集索引时

尝试创建聚集索引时出现以下错误

该语句已终止。
消息 596,级别 21,状态 1,第 0 行
无法继续执行,因为会话处于终止状态。

Msg 0, Level 20, State 0, Line 0
当前命令发生严重错误。结果,如果有的话,应该被丢弃。

指数是:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT

BEGIN TRANSACTION
GO

CREATE CLUSTERED INDEX IX_CO_DES_INPUT 
ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME)
          WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
               ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

ALTER TABLE dbo.CO_DES_INPUT 
  SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Run Code Online (Sandbox Code Playgroud)

我在 Windows …

sql-server sql-server-2012

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

可以参与 SET 操作的局部变量的最大数量是多少?

我有一个包含业务逻辑的存储过程。在它里面我有大约 1609 个变量(不要问我为什么,这就是引擎的工作原理)。我尝试将SET一个变量连接到所有其他变量的连接值。结果在创建过程中出现错误:

消息 8631,级别 17,状态 1,过程 XXX,行 YYY 内部错误:已达到服务器堆栈限制。请在您的查询中寻找潜在的深层嵌套,并尝试简化它。

我发现错误是由于我需要在SET操作中使用的变量数量。我可以通过将其一分为二来执行任务。

我的问题是这方面有一些限制吗?我查了查,但没有找到。

我们检查了此 KB 中描述的错误,但这不是我们的情况。我们不在CASE代码中使用任何表达式。我们使用该临时变量来准备必须使用 CLR 函数替换的值列表。我们将 SQL Server 更新为 SP3 CU6(最新的),但我们仍然遇到错误。

sql-server t-sql database-internals sql-server-2012 errors

11
推荐指数
2
解决办法
2783
查看次数

是否可以根据 SQL Server 版本选择 RAISERROR 或 THROW?

这是我现在的代码:

BEGIN TRY
INSERT INTO TABLE (F1,F2,F3) 
VALUES ('1','2','3')
END TRY
BEGIN CATCH
;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

效果很好,除非它在装有 SQL 2008 的机器上运行。我想让 CATCH 块检查 SQL 版本并运行 THROW(如果它等于或高于 2012 年),如果是 2008 年则运行 RAISERROR。我一直遇到语法错误,我想知道是否有可能。即使像这样简单的事情也不适合我。

BEGIN CATCH
IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏。

sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 sql-server-2014

11
推荐指数
1
解决办法
925
查看次数

动态SQL(pivot查询)转换为xml输出时,为什么日期的第一位转换为unicode?

我正在使用Bluefeet 的这个很好的例子https://dba.stackexchange.com/a/25818/113298,来创建一个数据透视表并将其转换为 xml 数据。

声明参数

DECLARE @cols AS NVARCHAR(MAX),  @query  AS NVARCHAR(MAX);
Run Code Online (Sandbox Code Playgroud)

接下来有一个代码很多的CTE,CTE的最终结果放在一个临时数据库中(与示例中相同)

SELECT 
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Run Code Online (Sandbox Code Playgroud)

生成 cols(与示例相同)

SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120)) 
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'');
Run Code Online (Sandbox Code Playgroud)

结果集是我应该期望的

set @query = 
   'SELECT [Guid],' + @cols +'
    FROM
    (
        SELECT 
            [StayDate] 
           ,[Guid]
        FROM #tempDates
    ) A
    pivot
    (
        count([StayDate])
        for [StayDate] in (' + @cols +')                    
    ) …
Run Code Online (Sandbox Code Playgroud)

xml sql-server pivot

11
推荐指数
2
解决办法
2983
查看次数

将标识列从 INT 更改为 BIGINT

我有一个带有标识列的表,它也是一个主键。目前,它有 5000 万行,身份列的最高值是 148,921,803。该表有很多DELETEs 并INSERTS在其上执行,因此价值很高。

我们要将数据类型从 更改INT为BIGINT以准备添加更多行。请注意,没有对 PK 列的引用。

做到这一点的最佳方法是什么,停机时间最少?我有两个选择。

  1. 删除 PK 并更改列;或者
  2. 复制落重命名方法,描述在这里:

sql-server sql-server-2008-r2 identity

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

如何在标准 SQL 或 T-SQL 中生成 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... 系列?

给定两个数字nand m,我想生成一系列的形式

1, 2, ..., (n-1), n, n, (n-1), ... 2, 1
Run Code Online (Sandbox Code Playgroud)

并重复它m几次。

例如,对于n = 3and m = 4,我想要以下 24 个数字的序列:

1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1
----------------  ----------------  ----------------  ----------------
Run Code Online (Sandbox Code Playgroud)

我知道如何通过以下两种方法之一在 PostgreSQL 中实现此结果:

使用以下查询,该查询使用该generate_series函数,以及一些确保订单正确的技巧:

WITH parameters (n, m) AS
(
    VALUES (3, 5)
)
SELECT 
    xi
FROM
(
    SELECT
        i, i …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server t-sql functions

11
推荐指数
4
解决办法
7402
查看次数

使用跨数据库证书时触发器中的权限

我使用跨数据库证书(如 Erland Sommarskog 所述)来控制对我环境中某个数据库的访问(SQL Server 2008 R2)。

我在数据库 A 中存储了更新数据库 B 中表的存储过程。直到现在,这一直适用于 db A 中的各种存储过程和 db B 中的表。我正在尝试更新 db B 中的表,但该表上有一个触发器。此触发器在 db B 的另一个表中插入其他数据。我收到错误消息:

消息 916,级别 14,状态 1,过程 table_trigger,第 11 行 服务器主体“sql\login”在当前安全上下文下无法访问数据库“B”。

我尝试为与证书绑定的数据库 B 用户授予插入权限以插入其他表,但它没有解决错误。除了更改触发器以使其使用之外,我还有其他选择WITH EXECUTE AS OWNER吗?

这是复制问题的 DDL:

CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

CREATE DATABASE A;
CREATE DATABASE B;

USE A;

CREATE TABLE dbo.SPtoUpdate
    (
      ID INT
    , ILoveFishing VARCHAR(255)
    );
INSERT INTO dbo.SPtoUpdate
        ( ID , ILoveFishing )
VALUES  ( …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server permissions signature certificate

11
推荐指数
1
解决办法
2131
查看次数

为什么嵌套循环连接只支持左连接?

在 Craig Freedman 的博客Nested Loops Join 中,他解释了为什么嵌套循环联接不能支持右外联接:

问题是我们多次扫描内表——外连接的每一行扫描一次。在这些多次扫描期间,我们可能会多次遇到相同的内部行。在什么时候我们可以得出结论,特定的内部行没有或不会加入?

有人可以用一种非常简单和有教育意义的方式解释一下吗?

这是否意味着循环从外表 ( R1) 开始并扫描内表 ( R2)?

我知道对于R1不与 连接的值,R2应将其替换为 aNULL以便结果集变为 ( NULL, R2)。对我来说,R2当R1不加入时似乎不可能返回一个值,因为它不知道R2要返回哪个值。但这不是它的解释方式。或者是吗?

SQL Server会在事实上优化(经常替换)RIGHT JOIN用LEFT JOIN,但问题是解释为什么它在技术上是不可能的NESTED LOOPS JOIN使用/支持RIGHT JOIN逻辑。

join sql-server database-internals

11
推荐指数
2
解决办法
1525
查看次数