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

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

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 ответов

Попробуйте с помощью вкладки

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

или используя NCHAR

print convert(nvarchar(8),@productID) +  @productName

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

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

В зависимости от длины вашего номера:

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

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

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

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

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

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

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

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

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

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

Вы бы в конечном итоге

1 яблоко

2 банана

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

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

Wes

Другие вопросы по тегам