2017-09-27 18 views
0

我想写从我们的本地数据库到数据仓库服务器上截断我们的数据仓库中的第一个表,然后复制数据的存储过程。问题截断表在链接服务器

下面的代码:

USE [ARGTPAWN-DB-DWH].[DWH].[dbo].[PML]; 
GO 

TRUNCATE TABLE [ARGTPAWN-DB-DWH].[DWH].[dbo].[PML]; 
GO 

SELECT * 
INTO [ARGTPAWN-DB-DWH].[DWH].[dbo].[PML] 
FROM [14TPAWNDB001].[FLMedicaid].[dbo].[PML] 
GO 

而且我得到的回应是:

消息911,级别16,状态1,行1
数据库 'ARGTPAWN-DB-DWH'不存在。确保名称输入正确。

Msg 4701,Level 16,State 1,Line 3
找不到对象“PML”,因为它不存在或您没有权限。

消息117,等级15,状态1,行7
对象名称'ARGTPAWN-DB-DWH.DWH.dbo.PML'包含超过最大数量的前缀。最大值为2.

服务器已经连接,所以这不是问题,但我很好奇为什么这不起作用。

+0

在此程序存在的数据库中? – xQbert

+1

你的SQL根本没有意义。首先,存储过程在哪里?你把所有东西当作桌子/视图,所以目前还不清楚。第一行也完全无效,你知道'USE'有什么用吗? – DavidG

+0

你是否试图通过链接服务器执行一个截断表的存储过程? – Tanner

回答

1

链接服务器和分布式查询可以在性能方面非常棘手......

你应该考虑写存储过程托管目标表,即使你与承载数据库调用它的数据库源表。

在目标数据库:

CREATE PROCEDURE [DBO].[TARGET_SIDE_PS] 
AS 

-- For error handling. 
DECLARE @aERROR int 
DECLARE @aCOUNT int 

-- Start transaction. 
BEGIN TRANSACTION 

-- Drop target table. 
IF OBJECT_ID('dbo.PML', 'U') IS NOT NULL 
DROP TABLE dbo.PML; 
-- Error catching 
SELECT @aERROR = @@ERROR, @aCOUNT = @@ROWCOUNT 
IF @aERROR<>0 
BEGIN 
    -- Error : do what is needed. 
    -- 
    ROLLBACK TRANSACTION 
    RETURN 1 
END 

SELECT * 
INTO dbo.PML 
FROM [SOURCELINKEDSERVER].[SOURCEDATABASE].[dbo].[PML] 
-- Error catching 
SELECT @aERROR = @@ERROR, @aCOUNT = @@ROWCOUNT 
IF @aERROR<>0 
BEGIN 
    -- Error : do what is needed. 
    -- 
    ROLLBACK TRANSACTION 
    RETURN 2 
END 
IF @aCOUNT <= 0 
BEGIN 
    -- No data: do what is needed. 
    -- 
    PRINT 'NO DATA !!' 
END 
COMMIT TRANSACTION 
RETURN 0 

呼叫从源侧的目标侧PS(或目标端)和它的工作要做,但源端数据库必须连接到目标端数据库。 事务可以消除由于丢弃/创建/插入序列。

您可以在源端执行oposite:PS,并在链接的目标端服务器数据库上进行删除和插入操作,但您必须知道: -事务将需要一段时间。 - 所有源数据将在整个过程中被锁定。 - INSERT需要一段时间。

+0

非常感谢! –

+0

不客气^^ – clementakis

0

你并不需要执行:

USE [ARGTPAWN-DB-DWH].[DWH].[dbo].[PML]; 

简单的执行下面的线。

0

什么是ARGTPAWN-DB-DWH?如果这是服务器名称,则不需要。

USE语句应该仅指数据库。

SELECT * INTO...将尝试创建表PML,如果已经存在(它将如果您正在执行截断)它会失败 - 使用INSERT INTO...DROP TABLE...而不是截断。

不要使用SELECT *。

+0

我认为这是一个链接的服务器 – Tanner

+0

它是一个链接的服务器。 –