2017-06-27 48 views
0

我是一個較新的SQL,我負責重構這段代碼。當我看到這個時,我想吐。如何添加一個循環到一個SQL SELECT

我試圖修改這個sproc,以便它可以返回任意數量的列而不是固定的數字。以下是它現在的樣子。

ALTER PROCEDURE [frsuser].[usp_report_UnitFeatureHeaders] 
AS 
BEGIN 
CREATE TABLE #features (SortOrder INT IDENTITY(1,1) 
          ,label NVARCHAR(20) ) 
INSERT INTO #features (label) 
    SELECT label FROM UnitAttributeDefinition order by tab_sort_order 

SELECT 'UnitID'             AS UnitID 
     ,'UnitName'             AS UnitName 
     ,'UnitAddress'            AS UnitAddress 
     ,'RateUnitType'            AS RateUnitType 
     ,'TaxDistrict'            AS TaxDistrict 
     ,'ContractType'            AS ContractType 
     ,'InactiveUnit'            AS InactiveUnit 
     ,(SELECT ISNULL(label,'') FROM #features WHERE SortOrder = 1) AS Feature01 
     ,(SELECT ISNULL(label,'') FROM #features WHERE SortOrder = 2) AS Feature02 
     ,(SELECT ISNULL(label,'') FROM #features WHERE SortOrder = 3) AS Feature03 
     ,(SELECT ISNULL(label,'') FROM #features WHERE SortOrder = 4) AS Feature04 
     ....... 
     ,(SELECT ISNULL(label,'') FROM #features WHERE SortOrder = 100) AS Feature100 
    DROP TABLE #features 
END 

下面是我想要的樣子。

ALTER PROCEDURE [frsuser].[usp_report_UnitFeatureHeaders] 
@numberOfFeatures Int = 100 
AS 
BEGIN 
CREATE TABLE #features (SortOrder INT IDENTITY(1,1) 
          ,label NVARCHAR(20) ) 
INSERT INTO #features (label) 
    SELECT label FROM UnitAttributeDefinition order by tab_sort_order 

DECLARE @counter INT = 0; 
DECLARE @featureName NVARCHAR (20) = 'Feature'; 


SELECT 'UnitID'             AS UnitID 
     ,'UnitName'             AS UnitName 
     ,'UnitAddress'            AS UnitAddress 
     ,'RateUnitType'            AS RateUnitType 
     ,'TaxDistrict'            AS TaxDistrict 
     ,'ContractType'            AS ContractType 
     ,'InactiveUnit'            AS InactiveUnit 
     (WHILE @counter < @numberOfFeatures 
      BEGIN 
       SET @featureName = 'Feature' + @counter; 
       (SELECT ISNULL(label,'') FROM #features WHERE SortOrder = @counter) 
      END 
     ) AS @featureName 

DROP TABLE #features 

END

就是這樣一個重構甚至可能嗎?如果是這樣,它會是什麼樣子?

+0

您只能使用動態sql和STUFF爲您的功能列實現此功能 – maSTAShuFu

+0

每當我在SQL問題中聽到LOOP ,我想吐了。 –

回答

3

你應該嘗試建立一個動態的SQL查詢,串聯你需要一個while循環的所有標籤,然後用sp_executesql的運行查詢應該是這樣的:

ALTER PROCEDURE [frsuser].[usp_report_UnitFeatureHeaders] 
@numberOfFeatures Int = 100 
AS 
BEGIN 
CREATE TABLE #features (SortOrder INT IDENTITY(1,1) 
          ,label NVARCHAR(20) ) 
INSERT INTO #features (label) 
    SELECT label FROM UnitAttributeDefinition order by tab_sort_order 

DECLARE @counter INT = 1; 
DECLARE @featureName NVARCHAR (20) = 'Feature'; 


-- 
DECLARE @SQL_QUERY NVARCHAR(MAX) 


SET @SQL_QUERY = 
' 
SELECT ''UnitID''             AS UnitID 
     ,''UnitName''             AS UnitName 
     ,''UnitAddress''            AS UnitAddress 
     ,''RateUnitType''            AS RateUnitType 
     ,''TaxDistrict''            AS TaxDistrict 
     ,''ContractType''            AS ContractType 
     ,''InactiveUnit''            AS InactiveUnit ' 

-- ADD FEATURES TO YOUR QUERY 

WHILE @counter <= @numberOfFeatures 

BEGIN 

    SET @SQL_QUERY = CAST((SELECT ISNULL(label,'') FROM #features WHERE SortOrder = @counter) AS nvarchar(100)) + ' AS Feauture '+ CAST(@counter as varchar(4)) + ' ' 
END 


SET @SQL_QUERY = 'FROM TABLE ....' --END OF THE QUERY STATEMENT 

DROP TABLE #features  

EXEC sp_executesql @statement = @query 

我想你應獲得@numberoffeautures,其中包含所有標籤的表的計數,而不是存儲過程的參數

+1

Upvoted,但是一件小事情是您的計數器從零開始,所以您將以Feature0的第一個特徵結束,並選擇SortOrder = 0等等。我認爲OP的問題假設它將從1開始。 – eequalsmcaputo

+0

你是可靠的,只是修復它 –

相關問題