简体   繁体   English

SQL Server 2014上的跨数据库查询

[英]cross database query on sql server 2014

I have a database with a memory optimized table. 我有一个带有内存优化表的数据库。 I want to archive this table in another database. 我想将此表归档到另一个数据库中。 I want to write an stored procedure to do that. 我想编写一个存储过程来做到这一点。

I am implemented below sample from 1 and 2 successfully, but in these sample, the first database is not in memory and the second database is in memory. 下面的示例12成功实现了我,但是在这些示例中,第一个数据库不在内存中,第二个数据库在内存中。 In my case, the first database is in memory and the second one can be in memory or not. 就我而言,第一个数据库在内存中,第二个数据库可以在内存中,也可以不在。

Here is my code: 这是我的代码:

1- my table : 1-我的桌子:

USE [TestReport]
GO

/****** Object:  Table [dbo].[Report]    Script Date: 1/22/2018 4:40:04 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Report]
(
    [ReportID] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [Year] [int] NOT NULL,
    [DayOfYear] [int] NOT NULL,
    [ProductType] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [ApplicationID] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [TotalSize] [bigint] NOT NULL DEFAULT ((0)),
    [TotalCount] [bigint] NOT NULL DEFAULT ((0)),
    [LastReportTimeSpan] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NULL,

INDEX [idx] NONCLUSTERED HASH 
(
    [ReportID],
    [DayOfYear]
)WITH ( BUCKET_COUNT = 131072),
CONSTRAINT [pk] PRIMARY KEY NONCLUSTERED HASH 
(
    [ReportID],
    [Year],
    [DayOfYear],
    [ProductType],
    [ApplicationID]
)WITH ( BUCKET_COUNT = 131072)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )

GO

2- simple Stored procedure 2-简单的存储过程

CREATE PROCEDURE [dbo].[ArchiveReport]
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(
 TRANSACTION ISOLATION LEVEL =  SNAPSHOT, LANGUAGE =  N'us_english'
)
     BEGIN
         DECLARE @currentdate DATETIME2;
         SET @currentdate = GETDATE();
        declare @maintainDay INT = 5

    INSERT  TestReportArchive.[dbo].Report
         SELECT [ReportID],
                [Year],
                [DayOfYear],
                [ProductType],
                [ApplicationID],
                [TotalSize],
                [TotalCount],
            [LastReportTimeSpan]
          FROM [dbo].[Report] 
         WHERE DATEADD(day, [DayOfYear] + @maintainDay, DATEADD(YEAR, [Year] - 1900, 0)) > @currentdate;

         DELETE FROM [dbo].[Report]
         WHERE DATEADD(day, [DayOfYear] + @maintainDay, DATEADD(YEAR, [Year] - 1900, 0)) > @currentdate;

     END;
END

3- simple stored procedure error 3-简单的存储过程错误

Msg 4512, Level 16, State 3, Procedure ArchiveReport, Line 12
Cannot schema bind procedure 'dbo.ArchiveReport' because name 'TestReportArchive.dbo.Report' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

TestReportArchive is my destination database

4- using 1 and 2 . 4-使用12 definition of table variable 表变量的定义

USE [TestReport]
GO

/****** Object:  UserDefinedTableType [dbo].[MemoryType]    Script Date: 1/22/2018 4:35:14 PM ******/
CREATE TYPE [dbo].[MemoryType] AS TABLE(
    [ReportID] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [Year] [int] NOT NULL,
    [DayOfYear] [int] NOT NULL,
    [ProductType] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [ApplicationID] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [TotalSize] [bigint] NOT NULL,
    [TotalCount] [bigint] NOT NULL,
    [LastReportTimeSpan] [nvarchar](50) COLLATE Latin1_General_100_BIN2 NULL,
    INDEX [idx] NONCLUSTERED HASH 
(
    [ReportID],
    [DayOfYear]
)WITH ( BUCKET_COUNT = 131072)
)
WITH ( MEMORY_OPTIMIZED = ON )
GO

5- stored procedure with table variable 5-具有表变量的存储过程

CREATE PROCEDURE [dbo].[ArchiveReport]
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(
 TRANSACTION ISOLATION LEVEL =  SNAPSHOT, LANGUAGE =  N'us_english'
)
     BEGIN
         DECLARE @currentdate DATETIME2;
         SET @currentdate = GETDATE();
        declare @maintainDay INT = 5

         DECLARE @InMem [dbo].[MemoryType];

        INSERT @InMem
        SELECT [ReportID],
                [Year],
                [DayOfYear],
                [ProductType],
                [ApplicationID],
                [TotalSize],
                [TotalCount],
            [LastReportTimeSpan]
         FROM [dbo].[Report] 
         WHERE DATEADD(day, [DayOfYear] + @maintainDay, DATEADD(YEAR, [Year] - 1900, 0)) > @currentdate;
         INSERT  TestReportArchive.[dbo].[Report]
         SELECT [ReportID],
                [Year],
                [DayOfYear],
                [ProductType],
                [ApplicationID],
                [TotalSize],
                [TotalCount],
            [LastReportTimeSpan]
         FROM @InMem

         DELETE FROM [dbo].[Report]
         WHERE DATEADD(day, [DayOfYear] + @maintainDay, DATEADD(YEAR, [Year] - 1900, 0)) > @currentdate;

     END;
END

6- Error from 5 stored procedure 6-5个存储过程出错

Msg 4512, Level 16, State 3, Procedure ArchiveReport, Line 25
Cannot schema bind procedure 'dbo.ArchiveReport' because name 'TestReportArchive.dbo.Report' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

TestReportArchive is my destination database

Cross-database queries involving Memory-Optimized Tables are not supported. 不支持涉及内存优化表的跨数据库查询。

Unsupported SQL Server Features for In-Memory OLTP 内存中OLTP不支持的SQL Server功能

A query cannot access other databases if the query uses either a memory-optimized table or a natively compiled stored procedure. 如果查询使用内存优化表或本机编译的存储过程,则该查询无法访问其他数据库。 This restriction applies to transactions as well as to queries. 此限制适用于事务以及查询。

Ultimately I created a non-memory-optimized table (ReportTemp) on the testReport (first Database) and change the stored procedure to insert data from Report Table to ReportTemp Table in the first database. 最终,我在testReport(第一个数据库)上创建了一个非内存优化表(ReportTemp),并更改了存储过程以将数据从Report Table插入第一个数据库中的ReportTemp Table。 Then I write another SP to move Data to archive Database. 然后,我编写另一个SP将数据移至存档数据库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM