2016-04-21 13 views
1

Ich muss das Ergebnis einer SQL-Abfrage zählen, die ich nicht kontrollieren kann. Meine Idee ist es, das innere SQL mit einer Wrapper-Count-Abfrage zu umhüllen. Die äußere SQL ist ziemlich einfach, hier ist was ich bekam:Erhalten der Anzahl einer Unteranfrage

select count(*) from (x) as CountQuery 

wo x ist was auch immer die innere SQL geht. Das Problem dabei ist, dass einige Abfragen abstürzen würden, nämlich IF ELSE END.

Wie erstelle ich ein Wrapper-SQL, das erfolgreich SQL umschließt? Hier

ist ein Beispiel für eine der inneren SQL I zählen müssen:

IF null <> 'PIPELINE_STAGE' 
BEGIN 
WITH cnts AS 
(
SELECT 
     o.[OPPORTUNITY_ID] 
     ,[OPPORTUNITY_NAME] 
     ,[OPPORTUNITY_DETAILS] 
     ,[IMAGE_URL] 
     ,OPPORTUNITY_VALUE 
     ,[PROBABILITY] 
     ,[BID_CURRENCY] 
     ,[BID_AMOUNT] 
     ,[BID_TYPE] 
     ,[BID_DURATION] 
     ,[FORECAST_CLOSE_DATE] 
     ,o.[CATEGORY_ID] 
     ,c.CATEGORY_NAME 
     ,c.BACKGROUND_COLOR 
     ,o.[PIPELINE_ID] 
     ,o.[STAGE_ID] 
     ,[OPPORTUNITY_STATE] 
     ,[RESPONSIBLE_USER_ID] 
     ,u.[First_Name] 
     ,u.[Last_Name] 
     ,o.[VISIBLE_TO] 
     ,o.VISIBLE_TEAM_ID 
     ,o.[DATE_CREATED_UTC] 
     ,o.[DATE_UPDATED_UTC] 
     ,o.OWNER_USER_ID 
     ,o.IMPORT_ID 
     ,Follow_id 
     ,ROW_NUMBER() OVER(ORDER BY CASE WHEN @sortOrder = 'OPPORTUNITY_NAME' THEN OPPORTUNITY_NAME END, 
    CASE WHEN @sortOrder = 'RESPONSIBLE_USER' THEN ISNULL(u.[FIRST_Name], 'zz') END, 
    CASE WHEN @sortOrder = 'FORECAST_CLOSE_DATE' THEN Forecast_Close_Date END, 
    CASE WHEN @sortOrder = 'DATE_CREATED' THEN o.[DATE_CREATED_UTC] END, 
    CASE WHEN @sortOrder = 'FORECAST_CLOSE_DATE_DESC' THEN Forecast_Close_Date END DESC, 
    CASE WHEN @sortOrder = 'DATE_CREATED_DESC' THEN o.[DATE_CREATED_UTC] END DESC 
     ) as intRow, 
    COUNT(o.INSTANCE_ID) OVER() AS Count 
    FROM [Insightly].[dbo].[Opportunity] o with (nolock) 
    LEFT JOIN [Insightly].[dbo].[Reference.Category] c with (nolock) 
    on o.CATEGORY_ID = c.CATEGORY_ID AND c.INSTANCE_ID = @instanceId 
    LEFT JOIN [Insightly].[dbo].[User] u WITH (NOLOCK) 
    ON u.USER_ID = o.RESPONSIBLE_USER_ID AND u.INSTANCE_ID = @instanceId 
    LEFT JOIN [Insightly].[dbo].[User.Follow] uf WITH (NOLOCK) 
    ON (o.OPPORTUNITY_ID = uf.OPPORTUNITY_ID AND uf.USER_ID = @currentUserId AND uf.INSTANCE_ID = @instanceId) 
WHERE o.INSTANCE_ID = @instanceId AND TEMPORARY = 0 
AND (@userId IS NULL OR [RESPONSIBLE_USER_ID] [email protected]) AND (@categoryId IS NULL OR c.CATEGORY_ID = @categoryId) 
AND (@importId IS NULL OR o.IMPORT_ID = @importId) 
AND OPPORTUNITY_STATE in @opportunityState) 
SELECT * FROM cnts 
WHERE intRow BETWEEN @skip AND @take 
END 
ELSE 
BEGIN 
WITH cnts AS 
(
SELECT 
     o.[OPPORTUNITY_ID] 
     ,[OPPORTUNITY_NAME] 
     ,[OPPORTUNITY_DETAILS] 
     ,[IMAGE_URL] 
     ,OPPORTUNITY_VALUE 
     ,[PROBABILITY] 
     ,[BID_CURRENCY] 
     ,[BID_AMOUNT] 
     ,[BID_TYPE] 
     ,[BID_DURATION] 
     ,[FORECAST_CLOSE_DATE] 
     ,o.[CATEGORY_ID] 
     ,c.CATEGORY_NAME 
     ,c.BACKGROUND_COLOR 
     ,o.[PIPELINE_ID] 
     ,o.[STAGE_ID] 
     ,[OPPORTUNITY_STATE] 
     ,[RESPONSIBLE_USER_ID] 
     ,u.[First_Name] 
     ,u.[Last_Name] 
     ,o.[VISIBLE_TO] 
     ,o.VISIBLE_TEAM_ID 
     ,o.[DATE_CREATED_UTC] 
     ,o.[DATE_UPDATED_UTC] 
     ,o.OWNER_USER_ID 
     ,o.IMPORT_ID 
     ,Follow_id 
     ,ROW_NUMBER() OVER(ORDER BY ISNULL(p.Pipeline_Name, 'zz'), ISNULL([Pipeline.Stage].Stage_Order, 999) 
     ) as intRow, 
    COUNT(o.INSTANCE_ID) OVER() AS Count 
    FROM [Insightly].[dbo].[Opportunity] o with (nolock) 
    LEFT JOIN [Insightly].[dbo].[Reference.Category] c with (nolock) 
    on o.CATEGORY_ID = c.CATEGORY_ID AND c.INSTANCE_ID = @instanceId 
    LEFT JOIN [Insightly].[dbo].[User] u WITH (NOLOCK) 
    ON u.USER_ID = o.RESPONSIBLE_USER_ID AND u.INSTANCE_ID = @instanceId 
    LEFT JOIN [Insightly].[dbo].[User.Follow] uf WITH (NOLOCK) 
    ON (o.OPPORTUNITY_ID = uf.OPPORTUNITY_ID AND uf.USER_ID = @currentUserId AND uf.INSTANCE_ID = @instanceId) 
LEFT OUTER JOIN [Pipeline.Stage] with(nolock) ON o.PIPELINE_ID = [Pipeline.Stage].PIPELINE_ID AND o.STAGE_ID = [Pipeline.Stage].STAGE_ID 
LEFT OUTER JOIN [Pipeline] p with(nolock) ON o.PIPELINE_ID = p.PIPELINE_ID AND p.INSTANCE_ID = @instanceId 
WHERE o.INSTANCE_ID = @instanceId AND TEMPORARY = 0 
AND (@userId IS NULL OR [RESPONSIBLE_USER_ID] [email protected]) AND (@categoryId IS NULL OR c.CATEGORY_ID = @categoryId) 
AND (@importId IS NULL OR o.IMPORT_ID = @importId) 
SELECT * FROM cnts 
WHERE intRow BETWEEN @skip AND @take 
END 

Antwort

1

Sie können eine temporäre Tabelle auf der Abfrage erstellen basiert und dann die Zeilen darin zählen.

CREATE TEMPORARY TABLE my_results 
<whatever query you have>; 

SELECT COUNT(*) FROM my_results; 
+0

Ich denke, das würde funktionieren, aber es wäre ziemlich langsam. – Bill

+0

Nicht, wenn sich die temporäre Tabelle im Speicher befindet. Je nach Plattform können Sie dies möglicherweise im Code angeben. Das OP hat nicht genügend Informationen zur Verfügung gestellt, um dies festzustellen. – yk11

Verwandte Themen