2010-08-24 5 views
1

J'ai écrit un curseur comme ci-dessous:base de données

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 

maintenant imprimer l'identifiant et le nom du produit dans l'autre comme:

1 
Coffee 
2 
Apple … 

Mais je veux avoir l'identifiant et nom de chaque produit dans une même ligne comme:

1 coffee 
2 apple … 

Que puis-je faire? J'ai converti l'id dans la chaîne et utilise + '' + pour concaténer l'identifiant et le nom dans une même chaîne. Mais comme les identifiants et les noms n'ont pas la même longueur, le résultat n'a pas été net. Y a-t-un autre moyen de faire ça?

+2

Pourquoi utilisez-vous un curseur pour cela? – codingbadger

+0

La réponse la plus commune est probablement que cela devrait être la responsabilité de l'application client, néanmoins, où avez-vous besoin d'être formaté? Dans le studio de gestion, application client, ailleurs? –

+0

@Barry - Je suis HOPING plus d'un nom de produit peut avoir un ID de produit, et ils ne veulent pas répéter les ID de produit. J'espère. – LittleBobbyTables

Répondre

2

essayer en utilisant un TAB

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

ou en utilisant NCHAR

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

ce n'est pas mon ordinateur maintenant je n'ai pas de serveur SQL sur celui-ci, mais je vais l'essayer plus tard. N'y a-t-il pas une autre façon? – sara

1

En fonction de la durée de votre numéro peut être:

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

CHAR droit pad le nombre avec des espaces supplémentaires, vous donnant un fixe avec pour le nombre.

+0

merci, je vais l'essayer – sara

0

je suppose que la solution plus simple serait de définir des règles de mise en forme application cliente, mais si vous avez vraiment besoin dans la base de données est simple, pourquoi utiliser le curseur comme dans votre solution:

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

Pourquoi utiliser un varchar quand vous allez juste à droite avec des espaces? Pourquoi seulement les six chiffres de gauche quand un nombre entier peut avoir jusqu'à 10? – LittleBobbyTables

1

Au début, vous pourrait déterminer la longueur du nombre le plus long

DECLARE @length INT 

SELECT @length = CAST(LOG10(MAX(productID)) AS INT)+1 FROM products 

ensuite l'incorporer dans votre déclaration d'impression comme

PRINT LEFT(CAST(@productID AS VARCHAR(10)) + 
    SPACE(@length),@length) + ' ' + @productName 

Je voudrais simplement utiliser "Résultats en tant que texte" dans SSMS pour cela plutôt que d'un curseur. J'espère que c'est juste un exercice d'apprentissage!

+0

Je pense que c'est la meilleure solution, merci – sara

0

Au lieu d'utiliser les curseurs, vous pouvez utiliser une table comme ça ...

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

J'ai besoin de curseur, mais je vais essayer votre code aussi, merci pour votre aide – sara

+0

Pour quoi avez-vous besoin de curseurs? Je peux imaginer un cas d'utilisation où c'est vraiment nécessaire ... –

0

Pourquoi utilisez-vous un curseur pour une lecture simple .. il est incroyablement lent et ne traitera que d'une ligne à la fois! Restez à l'écart des curseurs à TOUS les coûts!

Vous pouvez les récupérer en tant que nouvelle colonne avec une instruction select simple.

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

La première partie sélectionne l'ID de produit sous forme de chaîne .. puis il contaonates un « espace » (» «) concatones alors le nom du produit à la fin de celui-ci.

Vous finiriez avec

1 Pomme

2 Banana

etc etc, et ce serait 1000x plus rapide que votre curseur

espoir qui aide,

Wes