1

私は次のようなカーソルを書きました:

declare myCursor cursor 
for select productID, productName from products
declare @productID int 
declare @productName nvarchar(50)

open myCursor
fetch next from myCursor into @productID,@productName
print @productID
print @productName
set @productID=0
set @productName=''

while @@FETCH_STATUS=0
begin
    fetch next from myCursor into @productID,@productName
    print @productID
    print @productName
    set @productID=0
    set @productName=''
end
close myCursor
deallocate myCursor

次のように、製品のIDと名前を相互に出力します。

1
Coffee
2
Apple …

しかし、次のように各製品のIDと名前を同じ行に入れたい:

1   coffee
2   apple  …

私に何ができる?ID を文字列に変換し、 +''+ を使用して ID と名前を同じ文字列に連結します。しかし、ID と名前の長さが同じでないため、きれいな結果が得られませんでした。これを行う他の方法はありますか?

4

6 に答える 6

2

TABを使ってみてください

print convert(nvarchar(30),@productID) + char(9) + @productName

またはNCHARを使用して

print convert(nvarchar(8),@productID) +  @productName
于 2010-08-24T11:29:30.510 に答える
1

最初に、最長の数字の長さを決定できます

DECLARE @length INT

SELECT @length = CAST(LOG10(MAX(productID)) AS INT)+1 FROM products

次に、次のように印刷ステートメントに組み込みます。

PRINT LEFT(CAST(@productID AS VARCHAR(10)) + 
    SPACE(@length),@length) + ' ' + @productName

これには、カーソルではなく、SSMSの「結果をテキストとして」を使用します。うまくいけば、それは単なる学習演習です!

于 2010-08-24T11:38:02.367 に答える
1

番号の長さに応じて:

print convert(char(10), @productID) + ' ' + @productName

Charは、余分なスペースを使用して数値を右パディングし、数値を固定します。

于 2010-08-24T11:30:47.160 に答える
0

より簡単な解決策は、クライアントアプリケーションでフォーマットルールを定義することだと思いますが、データベースで本当に必要な場合、これは簡単です。ソリューションのようにカーソルを使用する理由は次のとおりです。

SELECT left(convert(varchar(20), productID) + '      ',6) + ' - ' + productName
from products
于 2010-08-24T11:37:01.430 に答える
0

カーソルを使用する代わりに、このようなテーブルを使用できます...

DECLARE @products TABLE (ProductID int, ProductName nvarchar(50), RowIndex int IDENTITY(1,1))

INSERT INTO @products (ProductID, ProductName) SELECT ProductID, ProductName FROM products

DECLARE @totalRows int
DECLARE @rowIndex int

SELECT 
    @totalRows = COUNT(RowIndex), 
    @rowIndex = 1 
FROM @products

DECLARE @ProductID int
DECLARE @ProductName nvarchar(50)

WHILE(@rowIndex < @totalRows)
BEGIN

    SELECT @ProductID = ProductID, @ProductName = ProductName FROM @products WHERE RowIndex = @rowIndex

    -- Do here your stuff...
    PRINT LEFT(CAST(@productID as varchar) + '      ',6) + ' - ' + @productName 

    SET @rowIndex = @rowIndex + 1   

END
于 2010-08-24T11:39:46.407 に答える
0

単純なフェッチにカーソルを使用するのはなぜですか..非常に遅く、一度に1行しか処理しません! 絶対にカーソルを避けてください。

単純な選択ステートメントを使用して、両方を新しい列として取得できます。

select convert(nvarchar(5),productID) + ' ' + productName as 'ID_Name' from products

最初の部分は、製品 ID を文字列として選択します。次に、「スペース」(「 」) を連結し、製品名をその末尾に連結します。

あなたはで終わるだろう

りんご1個

2 バナナ

などなど、現在のカーソルよりも1000倍高速です

それが役立つことを願って、

ウェス

于 2010-08-24T11:46:05.047 に答える