標籤:style blog http io os ar 使用 for sp
注意:這篇文章是專門針對人們已經熟悉了SQLCMD模式在SQL Server Management Studio中。雖然不是非常新穎的,讀者應該明白SQLCMD文檔中的準系統。 若對DOS命令Shell有一個基本的瞭解,也將讓你更好的理解下面這些例子。
步驟概述: 本文用於處理動態組建檔案,雖然我們在同一個指令碼中建立和運行檔案,但是隨著複雜度的提升結果將會難以預測。所以,公在允許意外丟失的情況下運行該例子。
不,SQLCMD我已經試過了...
如果你像我一樣,你可能花了數年進出SQL Server Management Studio中的SQLCMD模式。它有一些很好的功能,但其啟用帶著禁用智能感知的成本。就個人而言,我總是最後關閉它,並忘記它了好幾個月......直到現在...
在接下來的幾個職位,我將講到所有之前使你放棄了SQLCMD模式的ukjg。我的目標不是讓你保持在SSMS中的按鈕啟用,而是為了增強能力,你將永遠不會再忘記。
文章的開頭,我們先解決變數
setvary變數無力 問題。第二部分,我將很快搬出命令shell基礎知識,並為作為第三節,快樂真正開始的地方為背景。在第三節我會告訴你怎麼寫20行代碼來建立一個樣本包含450萬個獨特的名字的“perosn”表。
噢...我沒有使用智能感知與SQLCMD模式的解決方案,但它仍然是值得的....
不能以編程方式設定變數
SQLCMD模式下,可以設定基於文本值的變數。不幸的是,你不能設定基於SQL Server的輸出變數。它也不可能通過其他SQLCMD變數串聯或環境變數。
(This is not supported):SETVAR FileName (SELECT @@Servername + '.txt'):SETVAR NewVar $(OldVar1)$(OldVar2)(This is not supported)
通過程式產生一個“變數檔案”
下面的指令碼將產生一個系統中的臨時檔案夾名為“ GetServerName.sql ”的檔案。該檔案的內容,一個SETVAR命令,然後將來自同一指令碼讀取。
執行“ GetServerName ”之後,我們將使用我們的新的變數$ (檔案路徑)來建立系統使用者( server_principals )的測試檔案。
只是為了好玩,我們也將開啟這兩個檔案在年底對其進行審查記事本。請記住,
關閉記事本,不然SQL會一直正在運行。
:OUT $(TEMP)\GetServerName.sqlPRINT ':SETVAR FilePath $(TEMP)\' + @@SERVERNAME + '.txt'GO:OUT stdout:r $(TEMP)\GetServerName.sqlGO:OUT $(FilePath)SELECT name, create_date FROM master.sys.server_principalsGO:OUT stdout!!notepad $(TEMP)\GetServerName.sql!!notepad $(FilePath)
注意:
- 注意檔案路徑時,記事本開啟的第一個檔案( GetServerName.sql ) 。注意,系統參數, $ ( TEMP ) ,已經解決了自己的臨時目錄的完整路徑。
- 要知道一個變數前面,因為它的行為就像一個逸出字元,否定接下來的變數$反斜線字元( \ )的。
SQLCMD中,有沒有條件(if/then)邏輯?
真的!我們如何解決這個問題?我們要解決這一個與另一個動態產生的檔案。
假設我們想大量匯入本地檔案,運行BCP ,或處理一組的其他SQLCMD功能。如果我們的目標檔案不存在,我們通常沒有辦法退出指令碼。然而,我們可以使用DOS命令來執行類似的操作,以與前面例子中。為此,我們產生一個包含兩個指令碼一個檔案(根據條件得到滿足) 。我們首先建立一個“false/ Exit(退出) ”檔案。當我們執行,我們替換該檔案,當我們取得成功。
-- SQLCMD Error Handling:setvar ErrorCheckFile "ErrorCheckFile.sql" -- Set DOS commands that will display in the output window and run SQLCMD EXIT.:setvar ErrorStatusCommand "(ECHO !!ECHO ValidationFailure. Terminating Script. && ECHO :Exit)" -- The following line creates the file. Use this line for each situation that might require us to stop.!! $(ErrorStatusCommand) > $(TEMP)$(ErrorCheckFile) -- See if a file exists. If so, replace our EXIT command with a blank file.!! If EXIST $(TEMP)\*.* @ECHO. > $(TEMP)$(ErrorCheckFile) -- Now read/execute the result:r $(TEMP)$(ErrorCheckFile)!! ECHO Found files in the Temp folder (this is normal).!! ECHO.!! ECHO Checking Next File. -- Reset the file back to Exit!! $(ErrorStatusCommand) > $(TEMP)$(ErrorCheckFile)-- Try again with a file that shouldn't exist!! If EXIST $(TEMP)\ThisFileShouldNotBeHere.txt @ECHO. > $(TEMP)$(ErrorCheckFile) -- Now read/execute the result:r $(TEMP)$(ErrorCheckFile)!! ECHO You should not see this.PRINT 'You should not see this either'
如果我們的指令碼運行正確,輸出視窗將包含以下內容:
Found files in the Temp folder (this is normal).Checking Next File.ValidationFailure. Terminating Script.
好吧...花式DOS技巧......是不是這樣?沒了。這是我們開始有樂趣。我們將採取它在接下來的文章中的水平,但我們需要先做基礎。現在,我將離開你的方式來執行迴圈。
SET NOCOUNT ONIF OBJECT_ID('tempdb..#state') IS NULLBEGIN CREATE TABLE #state(TheStart DATETIME2) INSERT #state VALUES(DATEADD(S, 1, SYSDATETIME()))ENDGOPRINT 'Beginning Loop1'GODECLARE @TimeRemaining INTSELECT TOP 1 @TimeRemaining = DATEDIFF(MS, SYSDATETIME(), TheStart) FROM #statePRINT CAST(@TimeRemaining AS VARCHAR) + ' milliseconds to go...'GO:out $(TEMP)\loop2.sqlIF SYSDATETIME() <=(SELECT TOP 1 TheStart FROM #state)BEGIN PRINT 'PRINT ''Hello from loop2''' PRINT ':r $(TEMP)\loop.sql'ENDELSEBEGIN PRINT 'PRINT ''Last visit to Loop2!''' PRINT 'DROP TABLE #state'ENDGO:out STDOUTWAITFOR DELAY '0:00:00.1'GOPRINT 'Running loop-checker...'GO:r $(TEMP)\loop2.sql
有關調試最後需要說明的
從我的經驗與SQLCMD模式,意想不到的結果的最常見的原因是由於缺失GO語句或不插入線之間的空白。
- SQLCMD愛的空白。如果你的命令無法正常工作,嘗試將它上面下面加空格...
- SQLCMD也愛來解析一切,也不會想要的SQL引擎返回的響應。如果您需要SQLCMD與來自SQL Server的輸出工作,扔在一個GO語句。
- 切記不要把反斜線在變數名的前面。這並不工作: $ ( TEMP ) \ $ (檔案名稱)
- 添加更多的垂直空間。添加更多的GO語句。
原文連結
ssms中開啟sqlcmd
my code
我的情況
SQL Server Management Studio中:黑SQLCMD模式