2016-05-16 98 views
2

我有这样的脚本:MERGE语句,如果内部条件

DECLARE @TenantId INT = 1 
IF EXISTS(SELECT 1 
      FROM [DB1].[Client1].information_schema.tables 
      WHERE table_type='BASE TABLE' 
      AND [TABLE_SCHEMA] = 'dbo' 
      AND table_name='MyTable') 
BEGIN 

    MERGE info.[MyTable] AS t 
    USING (
      SELECT [Id], 
        [Name]     
       FROM [DB1].[Client1].dbo.MyTable 
     ) s 
     ON (t.[Id] = s.[Id] AND t.[TenantId] = @TenantId) 

    WHEN MATCHED THEN 
     UPDATE SET  
      t.[Name] = s.[Name] 

    WHEN NOT MATCHED THEN 
     INSERT ([Id], [TenantId], [Name]) 
     VALUES (s.[Id], @TenantId, s.[Name]); 

END 

为什么给我一个错误的选择了利用内幕,如果表不存在?我不能运行该脚本时表不存在。如果表格存在没问题。

+1

由于该表不存在,所以无法编译您的查询。您需要确保表格存在或将查询移动到动态sql中。 –

+0

当你运行某些东西时,会为每个语句创建一个查询计划,包括那些在块内部的语句。一切都必须存在才能成功完成。您可以通过将合并移入存储过程来完成此操作。 –

+0

谢谢你的答案 – carlosm

回答

0

由于评论表不存在,编译器将会报错。试试这个:

DECLARE @TenantId INT = 1 
    IF EXISTS(SELECT 1 
       FROM [DB1].[Client1].information_schema.tables 
       WHERE table_type='BASE TABLE' 
       AND [TABLE_SCHEMA] = 'dbo' 
       AND table_name='MyTable') 

    BEGIN 
    Declare @Sql Varchar(8000) 
    Set @Sql = 
    'MERGE info.[MyTable] AS t 
    USING (
      SELECT [Id], 
        [Name]     
       FROM [DB1].[Client1].dbo.MyTable 
     ) s 
     ON (t.[Id] = s.[Id] AND t.[TenantId] = ' + Convert(Varchar(8000), @TenantId) + ') 

    WHEN MATCHED THEN 
     UPDATE SET  
      t.[Name] = s.[Name] 

    WHEN NOT MATCHED THEN 
     INSERT ([Id], [TenantId], [Name]) 
     VALUES (s.[Id], '+ Convert(Varchar(8000), @TenantId) + ', s.[Name]); 
    Exec (@Sql) 
END