1

SQL サーバーに問題があります。SQLサーバーでコマンドを691回実行したい(VIDごと)。

ただし、VID 列の値は Sequential および Ascending ではありません。どうすればこのコマンドを実行できますか。

つまり、VID ごとにこのコマンドを実行し、その値の数は 691、最小値は 11、最大値は 7668 です。そして、各 VID の結果をテキスト ファイルに保存します。

コマンドは次のとおりです。

declare @vid integer

DECLARE @FileName varchar(8000)

declare @bcpCommand varchar(8000)

set @vid = 1

while (@vid < 692)

begin

SET @FileName = 'd:\re'+ CONVERT(char(8),@vid)+'.txt'



SET @bcpCommand =  'bcp "select ak_from,ak_to,w from [socialdb].[dbo].final where ???? "  queryout "'+ @FileName + '" -C -T -c -S SONY-VAIO\SQLEXPRESS1'

EXEC master..xp_cmdshell @bcpCommand



set @vid = (@vid + 1)

end

これを sql server 2008 で実行したいと考えています。最初のレコードはテーブル レコードの 1 つです。

vid に従ってレコードを分類する必要があり、同じ vid を持つ各レコードは、seprat txt ファイルにある必要があります。

テキスト ファイルに保存するには、bcp を使用します。私はそれで問題はありません。私の問題は、これを行うSQLサーバーのクエリにあります。私が言ったように、最初のレコードはその名前が最終的なテーブルに保存されます。これに対するクエリの書き方は?

4

1 に答える 1

4

このためのクエリを作成するには、クエリ可能な形式 (DB 内のテーブルなど) のデータが必要です。これがあれば、探している列 (ak_from、ak_to、w) だけを選択し、結果を bcp 経由でテキスト ファイルに配置するクエリを簡単に作成できます(bcp ユーティリティを使用して SQL クエリをテキスト ファイルにエクスポートする」を参照)。およびhttp://msdn.microsoft.com/en-us/library/ms162802.aspx )。

5 つ以上のレコードと 3 つの VID があると仮定すると、条件に基づいて複数のテキスト ファイルをループして作成できるように、カーソル内に bcp を書き込むことができます。

例として、次のコードは 5 つのレコードを一時テーブルに格納し、3 つのテキスト ファイルのそれぞれを出力します。

CREATE TABLE ##tbl
(
    Vid INT NOT NULL
    ,ak_from INT NOT NULL
    ,ak_to INT NOT NULL
    ,w INT NOT NULL
)

INSERT INTO ##tbl
SELECT 11, 164885, 164885, 24
UNION SELECT 11, 164885, 431072, 3
UNION SELECT 51, 731754, 690695, 2
UNION SELECT 51, 204086, 316310, 2
UNION SELECT 54, 818522, 501263, 1

DECLARE @vid VARCHAR(2)
DECLARE @querytextNoVid VARCHAR(100)
DECLARE @querytext VARCHAR(100)
DECLARE @filelocation VARCHAR(100)
DECLARE @cmd VARCHAR(255)

DECLARE vid_cursor CURSOR FOR SELECT DISTINCT vid FROM ##tbl
OPEN vid_cursor
FETCH NEXT FROM vid_cursor INTO @vid


WHILE @@FETCH_STATUS = 0
BEGIN

    SET @querytext = '"SELECT ak_from, ak_to, w FROM ##tbl WHERE vid = ' + @vid + '"'
    SET @filelocation = '"c:\out_vid' + @vid + '.dat"'
    SET @cmd = 'bcp ' + @querytext + ' queryout ' + @filelocation + ' -T -c'
    EXEC master..XP_CMDSHELL @cmd

    FETCH NEXT FROM vid_cursor INTO @vid
END
CLOSE vid_cursor
DEALLOCATE vid_cursor

DROP TABLE ##tbl

sp_configure を使用して xp_cmdshell が有効になっていることを確認する必要があります ( 「xp_cmdshell を有効にする」SQL Serverを参照してください) 。

于 2013-02-13T20:39:56.560 に答える