Вопрос базы данных
Я написал курсор, как показано ниже:
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