我写了一个像下面的光标:
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和名称长度不同,因此没有干净的结果。还有其他办法吗?
答案 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倍
希望有所帮助,
韦斯