-2

これは、物理ドライブの空きディスク容量と合計ディスク容量を取得するためのコードで、データは一時データベースに保存されます#output。私がやりたいのはfreespace、テーブルで利用可能な列の各値#outputを「1024000」と比較し、値がこれより小さい場合は、値を別のテーブルに入れたいということだけです。

私はSQLが初めてなので、これを行う方法がわかりません。

PSドライブの数はさまざまであるため、一般的なソリューションが必要です。

declare @svrName varchar(255)
declare @sql varchar(400)

set @svrName = @@SERVERNAME
set @sql = 'powershell.exe -c "Get-WmiObject -ComputerName ' + QUOTENAME(@svrName,'''') + ' -Class Win32_Volume -Filter ''DriveType = 3'' | select name,capacity,freespace | foreach{$_.name+''|''+$_.capacity/1048576+''%''+$_.freespace/1048576+''*''}"'
--creating a temporary table
CREATE TABLE #output
(line varchar(255))
--inserting disk name, total space and free space value in to temporary table

insert #output
EXEC xp_cmdshell @sql

select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
from #output
where line like '[A-Z][:]%'
order by drivename
4

1 に答える 1

0
declare @svrName varchar(255)
declare @sql varchar(400)

set @svrName = @@SERVERNAME
set @sql = 'powershell.exe -c "Get-WmiObject -ComputerName ' + QUOTENAME(@svrName,'''') + ' -Class Win32_Volume -Filter ''DriveType = 3'' | select name,capacity,freespace | foreach{$_.name+''|''+$_.capacity/1048576+''%''+$_.freespace/1048576+''*''}"'
--creating a temporary table
CREATE TABLE #output
(line varchar(255))
--inserting disk name, total space and free space value in to temporary table

insert #output
EXEC xp_cmdshell @sql

select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
from #output
where line like '[A-Z][:]%'
having (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0) < 20
order by drivename

あなたのコメントであなたの質問に直接答えます。

関数や計算フィールドを使用する場合、それらをWHERE句に入れることはできないため、使用する必要がありますHAVING。このソリューションでは、freespace(GB)の計算フィールドを使用し、それを句に入れてHAVING、20 を超える値を選択しました。

これらのタイプの関数で HAVING を使用できるかどうかわからないので、機能するかどうか教えてください。以下の他の解決策がうまくいかない場合:

declare @svrName varchar(255)
declare @sql varchar(400)

set @svrName = @@SERVERNAME
set @sql = 'powershell.exe -c "Get-WmiObject -ComputerName ' + QUOTENAME(@svrName,'''') + ' -Class Win32_Volume -Filter ''DriveType = 3'' | select name,capacity,freespace | foreach{$_.name+''|''+$_.capacity/1048576+''%''+$_.freespace/1048576+''*''}"'
--creating a temporary table
CREATE TABLE #output
(line varchar(255))
--inserting disk name, total space and free space value in to temporary table

insert #output
EXEC xp_cmdshell @sql

select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
into #output_2
from #output
where line like '[A-Z][:]%'
order by drivename

select *
from #output_2
where [freespace(GB)] < 20

この場合、#output からの値を別のテーブル (#output_2) に挿入しているため、WHERE句を直接使用できます。

于 2012-10-01T19:10:57.360 に答える