• <menu id="w2i4a"></menu>
  • logo SQL Prompt教程

    文檔首頁(yè)>>SQL Prompt教程>>SQL語(yǔ)法提示工具SQL Prompt教程:使用SQL Prompt重構(gòu)批處理或?qū)ο螅ㄏ拢?/a>

    SQL語(yǔ)法提示工具SQL Prompt教程:使用SQL Prompt重構(gòu)批處理或?qū)ο螅ㄏ拢?/h1>

    SQL Prompt是一款實(shí)用的SQL語(yǔ)法提示工具。SQL Prompt根據(jù)數(shù)據(jù)庫(kù)的對(duì)象名稱、語(yǔ)法和代碼片段自動(dòng)進(jìn)行檢索,為用戶提供合適的代碼選擇。自動(dòng)腳本設(shè)置使代碼簡(jiǎn)單易讀——當(dāng)開發(fā)者不大熟悉腳本時(shí)尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。

    點(diǎn)擊下載SQL Prompt免費(fèi)版

    本教程演示了SQL Prompt如何幫助“小規(guī)模” SQL重構(gòu)任務(wù),該任務(wù)的范圍通常僅限于您在本地工作的單批代碼或代碼對(duì)象。這些任務(wù)直接在SSMS查詢窗口中執(zhí)行,并且可以幫助您以各種方式重構(gòu)代碼,這些方式在測(cè)試存儲(chǔ)過程和對(duì)存儲(chǔ)過程進(jìn)行故障排除時(shí)非常有用。本文主要是教程后半部分,內(nèi)容緊接上文~

    使用代碼片段進(jìn)行重構(gòu)

    SQL Prompt的許多內(nèi)置代碼片段都包含$ SELECTEDTEXT $占位符。如果您在查詢窗口中突出顯示任何代碼并調(diào)用這些代碼段之一,它將把選定的文本插入到代碼段內(nèi)的占位符中。例如,我們可以將任何選定的代碼插入:

    • BEGIN…END塊(通過調(diào)用be片段)

    • IF塊(ifs

    • TRY…CATCH塊(tc

    • CTE(cte

    • 創(chuàng)建視圖(cv

    • 創(chuàng)建內(nèi)聯(lián)表值函數(shù)(citf

    我將演示幾個(gè)示例,并說明如何制作自己的代碼片段,就像這些一樣,您可以通過幾次擊鍵進(jìn)行調(diào)用。

    添加一個(gè)BEGIN…END

    前面清單中第一行代碼下的另一條綠色花樣是另一個(gè)SQL Prompt“警告”,該代碼提示其內(nèi)置代碼分析規(guī)則之一。在這種情況下,這是一種樣式規(guī)則(ST003),建議將過程主體包含在中BEGIN…END中。

    圖5

    這不是存儲(chǔ)過程的要求,但是正如規(guī)則(ST003)中的說明告訴我們的那樣,多行用戶定義函數(shù)需要它,因此保持一致是一個(gè)很好的做法。無論如何,我認(rèn)為一個(gè)BEGIN…END塊有助于弄清楚什么是對(duì)象中的代碼,哪些不是對(duì)象的代碼。

    要解決此問題,只需在過程中突出顯示查詢,然后從SQL Prompt的“操作”菜單中調(diào)用be片段即可?;蛘?,對(duì)于BEGIN…END、 WHILE 和IF,您只需右鍵單擊代碼,然后從上下文菜單中選擇“環(huán)繞聲”(Ctrl-K,Ctrl-S)。

    圖6

    現(xiàn)在,BAM,過程主體位于一個(gè)BEGIN...END塊中。在進(jìn)行此操作時(shí),我還使用了“插入分號(hào)” 操作向該END語(yǔ)句添加了分號(hào)。

    CREATE OR ALTER PROCEDURE Application.Cities$List
          @CityNameLike nvarchar(50) = '%', @CityNameUpperCaseFlag bit = 0
      AS
      BEGIN
          SELECT Cities.CityID,
                 CASE WHEN @CityNameUpperCaseFlag = 1
                          THEN UPPER(Cities.CityName)
                      ELSE Cities.CityName
                 END,
                 Cities.Location
          FROM   Application.Cities
          WHERE  Cities.CityName LIKE @CityNameLike;
      END;

    清單3

    將查詢重構(gòu)為代碼模塊

    SQL Prompt還可以輕松地以視圖、內(nèi)聯(lián)表值函數(shù)或公用表表達(dá)式的形式將查詢重構(gòu)為可重用的邏輯。例如,突出顯示清單4中的查詢…

    SELECT CustomerID,
             CustomerName,
             BillToCustomerID,
             CustomerCategoryID
      FROM   Sales.Customers;

    清單4

    并調(diào)用cv(創(chuàng)建視圖)代碼段,您的查詢現(xiàn)在包含在視圖定義的開始部分。

    CREATE VIEW [schema].[view_name]
      --WITH ENCRYPTION, SCHEMABINDING, VIEW_METADATA
      AS
          SELECT CustomerID,
                 CustomerName,
                 BillToCustomerID,
                 CustomerCategoryID
          FROM   Sales.Customers;
      -- WITH CHECK OPTION
      GO

    清單5

    這很好地提醒了視圖定義的重要部分,并且在給它命名后就可以在這里正常工作,但是在大多數(shù)情況下,這只是一個(gè)基本的起點(diǎn)。另外,沒有語(yǔ)法驗(yàn)證,因此您可以很高興地調(diào)用cv片段將清單6轉(zhuǎn)換為視圖,即使它不會(huì)編譯,因?yàn)闆]有變量聲明,即使有,也沒有變量在視圖中允許。

    SELECT CustomerID,
             CustomerName,
             BillToCustomerID,
             CustomerCategoryID
      FROM   Sales.Customers
      WHERE  @CustomerId = 1;

    清單6

    相反,您可能需要使用“創(chuàng)建內(nèi)聯(lián)表函數(shù)”(citf)代碼段。

    CREATE FUNCTION [schema].[function_name]
          (@parameter_name AS INT)
      RETURNS TABLE
      --WITH ENCRYPTION|SCHEMABINDING, ...
      AS
      RETURN ( SELECT CustomerID,
                      CustomerName,
                      BillToCustomerID,
                      CustomerCategoryID
               FROM   Sales.Customers
               WHERE  @CustomerId = 1; )
      GO

    清單7

    同樣,這是創(chuàng)建函數(shù)的一個(gè)有用的開始,特別是因?yàn)槲医?jīng)常忘記創(chuàng)建任何類型函數(shù)的語(yǔ)法,但是當(dāng)然,如果需要,您仍然需要處理@CustomerId變量并將其作為參數(shù)。

    使用自定義片段進(jìn)行重構(gòu)

    您可以輕松構(gòu)建自己的代碼片段來重構(gòu)一段代碼。例如,我經(jīng)常需要做的一件事就是使用多行注釋符號(hào)注釋掉大塊代碼。

    這是一個(gè)非常簡(jiǎn)單的自定義代碼片段。要?jiǎng)?chuàng)建它,只需瀏覽SQL Prompt | Snippet Manager…| New…,為代碼段添加一個(gè)初始名稱和說明,然后輸入代碼段代碼。創(chuàng)建此代碼后,我只需要突出顯示要注釋掉的塊,從“提示操作”列表中選擇“co”,文本將被包含在注釋中,我還將看到誰(shuí)注釋掉了文本,并且什么時(shí)候。

    圖7

    對(duì)于這樣的代碼段,我還可以看到很多其他用途,例如變量聲明(我創(chuàng)建了多少次@msg保存一條THROW語(yǔ)句的消息?)

    內(nèi)聯(lián)執(zhí)行:重構(gòu)以進(jìn)行測(cè)試

    提示:在查詢窗口中,突出顯示存儲(chǔ)過程的EXEC命令、標(biāo)量函數(shù)或sp_executesql函數(shù),然后從右鍵單擊內(nèi)容菜單中選擇Inline Exec。SQL Prompt用等效的內(nèi)聯(lián)代碼替換它。

    假設(shè)我們要測(cè)試應(yīng)用程序Cities$List存儲(chǔ)過程,因此我們對(duì)該過程的調(diào)用進(jìn)行了編碼,如下所示:

    EXECUTE Application.Cities$List @CityNameLike = 'Nash%'

    清單8

    這會(huì)返回大量數(shù)據(jù),并且您想更深入地看一下代碼,因?yàn)楦杏X有些不對(duì)勁。突出顯示Cities$List,右鍵單擊并選擇Inline Exec。該過程的參數(shù)將被轉(zhuǎn)換為變量,并將使用您傳入的變量值(或者默認(rèn)值,如果您已經(jīng)省略了一個(gè)參數(shù),就像我一樣),如清單9所示。

    DECLARE @CityNameLike1 nvarchar(50), @CityNameUpperCaseFlag1 bit;
      SET @CityNameLike1 = 'Nash%';
      SET @CityNameUpperCaseFlag1 = NULL;
      BEGIN
          SELECT Cities.CityID,
                 CASE WHEN @CityNameUpperCaseFlag1 = 1
                          THEN UPPER(Cities.CityName)
                      ELSE Cities.CityName
                 END,
                 Cities.Location
          FROM   Application.Cities
          WHERE  Cities.CityName LIKE @CityNameLike1;
      END;

    清單9

    這可能不是要做的最復(fù)雜的重構(gòu),但這是一項(xiàng)常見而繁瑣的任務(wù),尤其是當(dāng)您有很多參數(shù)并且一個(gè)或多個(gè)具有默認(rèn)值時(shí)。

    摘要

    SQL Prompt包含許多不錯(cuò)的工具,可以幫助您重構(gòu)代碼,這些工具都很小,很容易每天使用。作為程序員,有時(shí)很難不僅僅依賴于查找和替換,但是在SQL Prompt中,我發(fā)現(xiàn)更多類似這些工具的工具時(shí),在做事不那么簡(jiǎn)單的情況下,我發(fā)現(xiàn)它們?cè)接杏谩?/p>

    本教程內(nèi)容就是這樣了,感興趣的朋友可以下載SQL Prompt嘗試一下哦~

    相關(guān)內(nèi)容推薦:

    SQL語(yǔ)法提示工具SQL Prompt教程:使用SQL Prompt重構(gòu)批處理或?qū)ο螅ㄉ希?/span>

    SQL Prompt系列教程>>>


    想要購(gòu)買SQL Prompt正版授權(quán),或了解更多產(chǎn)品信息請(qǐng)點(diǎn)擊“咨詢?cè)诰€客服”

    Zend-Studio-640×220.png


    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();