近期在做“數(shù)據(jù)庫切割工具”時(shí),碰到了一些棘手的問題,經(jīng)過多方打探、查找,最終得以解決,現(xiàn)總結(jié)下來,給大家共享,免的大家以后在碰到類似問題時(shí)再耗費(fèi)大量時(shí)間去查找、去打探!
1、判斷輸入的路徑在服務(wù)器上是否存在:
例如,要在客戶端執(zhí)行一個(gè)創(chuàng)建數(shù)據(jù)庫的程序,數(shù)據(jù)庫要在服務(wù)器上創(chuàng)建,但路徑可以手工輸入,這時(shí)就面臨一個(gè)判斷自已現(xiàn)在輸入的路徑在服務(wù)器上是否存在的問題,免得在執(zhí)行Create Database SQL時(shí)才報(bào)錯(cuò):找不到路徑。
具體方法如下:
exec master..xp_cmdshell 'dir E:\DATA' ,在查詢分析器中執(zhí)行此段SQL,如果存在此路徑,會(huì)輸出此路徑下的所有文件與文件夾信息,還有此盤的可用字節(jié)數(shù)與已此文件夾的字節(jié)數(shù)(圖1所示);如果此路徑不存在,則輸出信息如圖2所示,提示“找不到文件”。
但是,當(dāng)路徑中含有空格時(shí),如C:\Program Files,直接用exec master..xp_cmdshell 'dir C:\Program Files',系統(tǒng)返回結(jié)果會(huì)如跟圖2顯示一樣,我們需要做額外處理,才能得到正確的返回結(jié)果:
(1)exec master..xp_cmdshell 'dir "C:\Program Files\Microsoft SQL Server\MSSQL"'
這種寫法,在查詢分析器中直接執(zhí)行是沒有問題的,也能返回正確結(jié)果,但如果放到程序中執(zhí)行:
SQL.Add('exec master..xp_cmdshell ''dir "C:\Program Files\Microsoft SQL Server\MSSQL"''),Open時(shí)就會(huì)報(bào)錯(cuò),不能執(zhí)行。
為什么呢???
(2)我們接下來查看SQL聯(lián)機(jī)幫助,對XP_CMDSHELL的描述如下:
xp_cmdshell {'command_string'} [, no_output]
參數(shù)
'command_string'
是在操作系統(tǒng)命令行解釋器上執(zhí)行的命令字符串。command_string 的數(shù)據(jù)類型為 varchar(255) 或 nvarchar(4000),沒有默認(rèn)值。command_string 不能包含一對以 上的雙引號。如果由 command_string 引用的文件路徑或程序名稱中有空格,則需要使用一對引號。如果使用嵌入空格不方便,可考慮使用 FAT 8.3 文件名作為解決辦 法。
no_output
是可選參數(shù),表示執(zhí)行給定的 command_string,但不向客戶端返回任何輸出。
幫助文件提示我們要用一對引號將文件路徑或者程序名稱包起來,將整個(gè)路徑包不起來不會(huì)報(bào)錯(cuò),那我就將帶有空格的單步路徑包起來試試,看看行不行,執(zhí)行 如下SQL:SQL.Add('exec master..xp_cmdshell ''dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL''),這樣Open時(shí)果然不報(bào)錯(cuò)了,看來查詢分析器的語法檢查與我們的Query自己的語法檢查還是有一定區(qū)別的,不能等同的。因此,碰到路徑中帶空格的情況,正確的寫法還是:
exec master..xp_cmdshell 'dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL'
這同時(shí)說明SQL幫助文件中的綠色字體部分 command_string 不能包含一對以上的雙引號 的描述是不正確的,看來SQL Server幫助文件與產(chǎn)品也出現(xiàn)了“規(guī)格與程序不相符”的問題
1、判斷輸入的路徑在服務(wù)器上是否存在:
例如,要在客戶端執(zhí)行一個(gè)創(chuàng)建數(shù)據(jù)庫的程序,數(shù)據(jù)庫要在服務(wù)器上創(chuàng)建,但路徑可以手工輸入,這時(shí)就面臨一個(gè)判斷自已現(xiàn)在輸入的路徑在服務(wù)器上是否存在的問題,免得在執(zhí)行Create Database SQL時(shí)才報(bào)錯(cuò):找不到路徑。
具體方法如下:
exec master..xp_cmdshell 'dir E:\DATA' ,在查詢分析器中執(zhí)行此段SQL,如果存在此路徑,會(huì)輸出此路徑下的所有文件與文件夾信息,還有此盤的可用字節(jié)數(shù)與已此文件夾的字節(jié)數(shù)(圖1所示);如果此路徑不存在,則輸出信息如圖2所示,提示“找不到文件”。
但是,當(dāng)路徑中含有空格時(shí),如C:\Program Files,直接用exec master..xp_cmdshell 'dir C:\Program Files',系統(tǒng)返回結(jié)果會(huì)如跟圖2顯示一樣,我們需要做額外處理,才能得到正確的返回結(jié)果:
(1)exec master..xp_cmdshell 'dir "C:\Program Files\Microsoft SQL Server\MSSQL"'
這種寫法,在查詢分析器中直接執(zhí)行是沒有問題的,也能返回正確結(jié)果,但如果放到程序中執(zhí)行:
SQL.Add('exec master..xp_cmdshell ''dir "C:\Program Files\Microsoft SQL Server\MSSQL"''),Open時(shí)就會(huì)報(bào)錯(cuò),不能執(zhí)行。
為什么呢???
(2)我們接下來查看SQL聯(lián)機(jī)幫助,對XP_CMDSHELL的描述如下:
xp_cmdshell {'command_string'} [, no_output]
參數(shù)
'command_string'
是在操作系統(tǒng)命令行解釋器上執(zhí)行的命令字符串。command_string 的數(shù)據(jù)類型為 varchar(255) 或 nvarchar(4000),沒有默認(rèn)值。command_string 不能包含一對以 上的雙引號。如果由 command_string 引用的文件路徑或程序名稱中有空格,則需要使用一對引號。如果使用嵌入空格不方便,可考慮使用 FAT 8.3 文件名作為解決辦 法。
no_output
是可選參數(shù),表示執(zhí)行給定的 command_string,但不向客戶端返回任何輸出。
幫助文件提示我們要用一對引號將文件路徑或者程序名稱包起來,將整個(gè)路徑包不起來不會(huì)報(bào)錯(cuò),那我就將帶有空格的單步路徑包起來試試,看看行不行,執(zhí)行 如下SQL:SQL.Add('exec master..xp_cmdshell ''dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL''),這樣Open時(shí)果然不報(bào)錯(cuò)了,看來查詢分析器的語法檢查與我們的Query自己的語法檢查還是有一定區(qū)別的,不能等同的。因此,碰到路徑中帶空格的情況,正確的寫法還是:
exec master..xp_cmdshell 'dir C:\"Program Files"\"Microsoft SQL Server"\MSSQL'
這同時(shí)說明SQL幫助文件中的綠色字體部分 command_string 不能包含一對以上的雙引號 的描述是不正確的,看來SQL Server幫助文件與產(chǎn)品也出現(xiàn)了“規(guī)格與程序不相符”的問題