вопрос базы данных - PullRequest
       8

вопрос базы данных

1 голос
/ 24 августа 2010

Я написал курсор, как показано ниже:

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

Теперь он печатает идентификатор и название продукта друг под другом, как:

1
Coffee
2
Apple …

Но я хочуидентификатор и название каждого продукта в одной строке, например:

1   coffee
2   apple  …

Что я могу сделать?Я преобразовал идентификатор в строку и использую + '' +, чтобы объединить идентификатор и имя в одной строке.Но поскольку идентификаторы и имена не имеют одинаковую длину, результат не был чистым.Есть ли другой способ сделать это?

Ответы [ 6 ]

2 голосов
/ 24 августа 2010

попробуйте с помощью TAB

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

или с помощью NCHAR

print convert(nvarchar(8),@productID) +  @productName
1 голос
/ 24 августа 2010

Вначале вы могли определить длину самого длинного числа

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 для этого, а не курсор.Надеюсь, это всего лишь учебное упражнение!

1 голос
/ 24 августа 2010

В зависимости от того, насколько длинным может быть ваш номер:

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

Char будет дополнять число правыми дополнительными пробелами, давая вам фиксированное значение для номера.

0 голосов
/ 24 августа 2010

Почему вы используете курсор для простой выборки ... он невероятно медленный и обрабатывает только одну строку за раз!Держитесь подальше от курсоров при ВСЕХ расходах!

Вы можете получить их оба в виде нового столбца с помощью простого оператора select.

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

Первая часть выбирает идентификатор продукта в виде строки.затем он связывается с «пробелом» ('), а затем конкатонирует название продукта до конца.

В итоге вы получите

1 Apple

2 Banana

и т. Д., И это будет в 1000 раз быстрее, чем ваш текущий курсор

Надеюсь, это поможет,

Уэс

0 голосов
/ 24 августа 2010

Вместо использования курсоров вы можете использовать такую ​​таблицу ...

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
0 голосов
/ 24 августа 2010

Полагаю, более простым решением было бы определение правил форматирования в клиентском приложении, но если вам это действительно нужно в базе данных, это просто, зачем использовать курсор как в вашем решении:

SELECT left(convert(varchar(20), productID) + '      ',6) + ' - ' + productName
from products
...