小编Hey*_*ude的帖子

为什么删除的索引仍然存在,它是否可以防止表被更改?

我有一个列(名为RequestDate),我需要将其从 更改NULLNOT NULL,但是该列上有一个聚集索引,因此我首先需要删除该索引。

最初,索引是使用以下方法创建的:

CREATE CLUSTERED INDEX IX_RequestDate   
    ON [MyDB].[dbo].[MyTable] (RequestDate); 
Run Code Online (Sandbox Code Playgroud)

为了放弃它,我执行了:

Drop Index IX_RequestDate On [MyDB].[dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)

然后尝试使用以下方法更改列无效性:

ALTER TABLE [MyDB].[dbo].[MyTable] ALTER COLUMN [RequestDate] DATETIME NOT NULL
Run Code Online (Sandbox Code Playgroud)

但是得到了一个错误:

对象“MyTable”依赖于“RequestDate”列。

然后我MyTable使用这个查询列出了的索引,并且索引仍然存在,尽管现在它没有名称并且它的类型是HEAP(最初CLUSTERED):

TableName   IndexName   IndexType   ColumnOrdinal   ColumnName     ColumnType
MyTable        NULL       HEAP         0            RequestDate     datetime
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 为什么下降的索引还在?
  2. 由于这个仍然存在的索引,我是否得到了上面的依赖错误?
    如果是这样,我该如何删除它?
    如果没有,还有什么我应该检查的吗?我想避免丢掉桌子。

请注意,此表没有任何限制。

我使用的是 SQL Server 2014、OS Windows Server 2012 R2,以下是SCRIPT TABLE AS -> CREATE TO(我更改了一些列名)的输出:

CREATE TABLE [dbo].[MyTable]( …
Run Code Online (Sandbox Code Playgroud)

index sql-server alter-table dependencies

5
推荐指数
1
解决办法
87
查看次数

修复插入时不带 N 前缀的损坏的 utf8 nvarchar 值

是否可以从没有前缀的损坏的 nvarchar 中恢复 UTF8 数据N

\n

例如,在下面的代码片段中,我希望@n1_fixed基于以下内容获得正确的值@n1

\n
declare\n  @n1 nvarchar(10) = '\xe1\xb8\xbe\xe1\xba\xa5xi\xe1\xb8\xbf\xe1\xbb\xa9\xc5\x9b',\n  @n2 nvarchar(10) = N'\xe1\xb8\xbe\xe1\xba\xa5xi\xe1\xb8\xbf\xe1\xbb\xa9\xc5\x9b';\n\ndeclare\n  @n1_fixed nvarchar(10); -- somehow make it have the correct value, based on @n1\n\nselect iif(@n1_fixed = @n2, 1, 0)\n
Run Code Online (Sandbox Code Playgroud)\n

sql-server collation utf-8 unicode

4
推荐指数
1
解决办法
591
查看次数

按零排序如何工作

在以下脚本中(请参阅此处的完整演示):

SELECT *
FROM Table1
ORDER BY 
   CASE WHEN Field1 IS NOT NULL 
     THEN 0 
   END
Run Code Online (Sandbox Code Playgroud)
  • 的类型是什么0
  • 0是如何解读的呢?它不是选择列表中列的序号,因为选择列表枚举从 1 开始,而不是 0。那么它是什么?

为了详细说明一下,将上面的代码片段与下面的代码片段进行比较,这会发出一个错误:

SELECT *
FROM Table1
ORDER BY 0  
Run Code Online (Sandbox Code Playgroud)

ORDER BY 位置号 0 超出了选择列表中的项目数范围。

还将其与以下代码片段进行比较,该代码片段会发出另一个错误:

SELECT *
FROM Table1
ORDER BY '0'
Run Code Online (Sandbox Code Playgroud)

在 ORDER BY 列表的位置 1 中遇到常量表达式。

似乎将0值嵌套在case子句下可以使其工作,但我不明白为什么以及如何?

  • 这个问题在某种程度上是这个旧问题的后续问题,它并没有解释为什么它与我上面列出的替代方案相比有效: How does work SQL with order by 0?

sql-server order-by

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

MERGE 与 MERGE INTO 之间有什么区别?

MERGE 与 MERGE INTO 之间有什么区别?
每个的用例是什么?

令人惊讶的是,我找不到任何询问这种差异的现有问题。

MERGE的文档也没有解释这一点,并且它仅在似乎与该差异(如果有)无关的情况下使用一次。

sql-server merge

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