Хранимая процедура T-SQL Соединение с таблицей, значение параметра дважды

У меня есть табличный параметр, к которому я хочу присоединиться, не один раз, а два раза. Один раз, чтобы получить строку, а второй раз, чтобы получить родительский ряд.

Я почти уверен, что это можно сделать с помощью обычных таблиц. Можно ли это сделать с помощью табличных параметров?

USE [ActivityStore_220.0_Model]
GO
/****** Object:  StoredProcedure [dbo].[SnapshotLineItemAggregations]    Script Date: 3/24/2017 5:49:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SnapshotLineItemAggregations]    
    @billingCycleIteration int,
    @tableOfBusinessEntities [dbo].[BusinessEntityNode] READONLY,
    @tableOfActivityNames [dbo].[IdNamePair] READONLY
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    BEGIN TRANSACTION

    --Note this will ONLY delete items that have the exact same BillingCycleIterationId.
    --This will not delete old records from previous billing cycle iterations.  
    DELETE FROM [dbo].[LineItemAggregationSnapshot] WHERE 
    BillingCycleIterationId = @billingCycleIteration

    -- Insert statements for procedure here
    INSERT INTO [dbo].[LineItemAggregationSnapshot]
    SELECT [BillingCycleIterationId]
      ,[BillToAccountId]      
      ,CASE be_table.BusinessEntityTypeId WHEN 1 THEN 'Merchant' ELSE 'Organization' END AS [BusinessEntityType]
      ,[BusinessEntityId]
      ,[ProductId]
      ,[ActivityId]
      ,[RateProfileId]
      ,[Count]
      ,[Quantity]
      ,[ConversionRate]
      ,[OriginatingCurrency]
      ,[ConvertedQuantity]
      ,[QuantityUnits]
      ,[Rate]
      ,be_table.Name [BusinessEntityDescription]
      ,parent_be.Name [ParentBusinessEntityName]      
      ,activity_table.Name [ItemDescription]
      ,[LineItemData]
    FROM [dbo].[LineItemAggregation] lia
    LEFT OUTER JOIN @tableOfBusinessEntities be_table
    ON be_table.Id = lia.BusinessEntityId
    LEFT OUTER JOIN @tableOfActivityNames activity_table
    ON activity_table.Id = lia.ActivityId
    LEFT OUTER JOIN @tableOfBusinessEntities parent_be --the second join
    ON parent_be.Id = be_table.ParentId
    WHERE BillingCycleIterationId = @billingCycleIteration

    COMMIT TRANSACTION
    select * from LineItemAggregationSnapshot
    where BillingCycleIterationId = @billingCycleIteration
END

У меня не было проблем с этим хранимым процессом, когда я только один раз присоединился к @tableOfBusinessEntities. Но во второй раз, когда я пытаюсь присоединиться к табличному параметру, хранимая процедура больше не работает.

Я не получаю сообщение об ошибке, каждый столбец, к которому я пытаюсь присоединиться, просто показывает ноль, как будто строки соединения больше не совпадают.

1 ответ

Решение

Итак, ошибка была в другом месте в моем коде. Как я заполнял.NET DataTable, точнее, не так.

Как только эта проблема была исправлена, хранимая процедура работала как чудо.

Таким образом, ответом для любого, кто задается вопросом в будущем, является ДА, вы можете объединять табличные параметры несколько раз, как в обычной таблице в SQL Server.

Другие вопросы по тегам