Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Дефинирана от потребителя таблица в паметта, не е в паметта?

Виждам и това.

Когато RCSI е активиран, тогава транзакциите с автоматичен ангажимент на нивото на ангажимент за четене по подразбиране работят добре при обединяване на два екземпляра от типа таблица в паметта.

DECLARE @t1 [dbo].[tType]
DECLARE @t2 [dbo].[tType]

INSERT INTO @t1 VALUES (1);

INSERT INTO @t2 VALUES (1);

SELECT *
FROM   @t1
       JOIN @t2
         ON [@t1].C = [@t2].C 

Също така свързването на две различни "нормални" таблици, оптимизирани за памет, работи добре без никакви съвети.

Освен това свързването на празен тип таблица, оптимизирана за памет, към нормална таблица, оптимизирана за памет, работи добре.

DECLARE @t [dbo].[tType];

SELECT *
FROM   [dbo].[tTable] t
        INNER JOIN @t
            ON [@t].C = t.C 

Но обратното не е вярно. Докато екземплярът на типа таблица в паметта съдържа поне един ред, тогава присъединяването му към (празна или друга) таблица в паметта води до грешка.

Решението е просто и е посочено в съобщението за грешка. Просто добавете подсказката за таблицата WITH (SNAPSHOT)

DECLARE @t [dbo].[tType]

INSERT INTO @t
VALUES     (1)

SELECT *
FROM   [dbo].[tTable] t WITH(SNAPSHOT)
       INNER JOIN @t
         ON [@t].C = t.C

Или по-малко гранулирано решение е

ALTER DATABASE [MemOptimized] 
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE 

Доколкото мога да разбера, нито едно от тях всъщност не променя семантиката и възможността да се пропусне подсказката при някои обстоятелства е просто удобство за програмиране.

Не съм сигурен защо тази комбинация от различни типове таблици с памет причинява това конкретно съобщение за грешка. Предполагам, че това е просто артефакт, че сте CTP и че при RTM или комбинацията ще бъде разрешена, или съобщението за грешка и документацията ще бъдат актуализирани, за да се отнасят не само за таблици, базирани на диск.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL съхранена процедура за връщане на предложени от Google резултати от търсенето

  2. Изпълнете съхранена процедура в друга съхранена процедура в SQL сървър

  3. Изчислете текущото общо / текущото салдо

  4. Как да коригирате „Име на корелация трябва да бъде посочено за груповия набор от редове в клаузата from.“ в SQL Server

  5. Как мога да изтрия дублиращи се редове в таблица