数据库问题

时间:2010-08-24 11:26:42

标签: sql-server tsql sql-server-2008 cursors

我写了一个像下面的光标:

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转换为String并使用+''+在同一个字符串中连接id和name。但由于ID和名称长度不同,因此没有干净的结果。还有其他办法吗?

6 个答案:

答案 0 :(得分:2)

尝试使用TAB

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

或使用NCHAR

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

答案 1 :(得分:1)

取决于您的电话号码的长度:

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

Char会使用额外的空格对数字进行右键填充,为数字提供固定的数字。

答案 2 :(得分: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中使用“结果为文本”而不​​是游标。希望这只是一个学习练习!

答案 3 :(得分:0)

我想更简单的解决方案是在客户端应用程序中定义格式化规则,但如果你真的需要在数据库中这很简单,为什么要在你的解决方案中使用游标:

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

答案 4 :(得分: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

答案 5 :(得分:0)

为什么使用游标进行简单的提取..它非常慢,并且一次只能处理一行!不惜一切代价远离游标!

您可以使用简单的select语句将它们作为新列检索。

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

第一部分选择产品ID作为字符串..然后它包含'空格'(''),然后将产品名称连接到它的末尾。

你最终得到了

1 Apple

2香蕉

等等,它比你当前的光标快1000倍

希望有所帮助,

韦斯