2012-01-25 2 views
1

J'ai le tableau suivant dans SQL ServerInsérer le numéro de la ligne courante dans la table SQL Server

CREATE TABLE [dbo].[tblTempPo](
    [TempPoID] [int] IDENTITY(1,1) NOT NULL, 
    [guid] AS ([dbo].[GetIdentity]()), 
    [Qty] [int] NULL, 
    [MobileBrandID] [int] NULL, 
    [MobileID] [int] NULL 
) 

J'ai besoin d'insérer le numéro de ligne à la colonne guid chaque fois qu'une nouvelle ligne est ajoutée. J'ai essayé d'utiliser la fonction suivante, mais cela ne fonctionne pas comme prévu.

ALTER FUNCTION GetIdentity() 
RETURNS INT AS 
BEGIN 
    RETURN (SELECT top 1 ROW_NUMBER() OVER(ORDER BY TempPoID asc)FROM tblTempPo) 
END 
+8

La colonne est appelée 'guid' mais il stocke un' int'?!?!? Ce sera un cauchemar d'entretien sur toute la ligne !! Vous devriez toujours adhérer au ** principe de la plus petite surprise ** - si quelque chose est ** appelé ** 'guid' - tout le monde s'attendrait à ce qu'il soit de type' Guid', aussi ..... –

+1

chaque fois qu'une rangée est ajoutée sera un goulot d'étranglement de performance énorme! ** POURQUOI ** avez-vous besoin de ** stocker ** ceci? Pourquoi ne pouvez-vous pas simplement le calculer (dans votre requête) en cas de besoin, à la volée, et être à jour tout le temps? –

+0

Si vous voulez avoir UniqueId pour la colonne 'Guid' vous pouvez définir la valeur par défaut comme' NEWID() '. –

Répondre

0

Je suis d'accord avec les commentaires et vous devriez changer le nom de la colonne GUID. Si vous devez vraiment stocker la colonne TempPoID deux fois, utilisez la colonne calculée. Exemple:

CREATE TABLE #tblTempPo (
    [TempPoID] [int] IDENTITY(1,1) NOT NULL, 
    [second_id] AS TempPoID, 
    [Qty] [int] NULL, 
    [MobileBrandID] [int] NULL, 
    [MobileID] [int] NULL 
) 

INSERT INTO #tblTempPo (Qty, MobileBrandID, MobileID) VALUES 
(10, 10, 15), (20, 23, 45), (55, 23, 12), (10, 1, 1) 

SELECT * FROM #tblTempPo 

DROP TABLE #tblTempPo 

Si vous avez besoin d'un déclencheur d'approche plus complexe.

0

Votre fonction GetIdentity() retournera probablement toujours 1 mais ce n'est pas une chose sûre parce que vous utilisez select top 1... sans clause order by.
Si vous souhaitez obtenir la valeur la plus élevée renvoyée par row_number(), vous devez ajouter order by 1 desc, ce qui équivaut à SELECT count(*) from tblTempPo.

fixation GetIdentity() comme ça ne va pas aider beaucoup dans votre situation parce que [guid] AS ([dbo].[GetIdentity]()) vous donnera une colonne calculée qui est évaluée chaque fois que vous requête la table et non lorsque vous insérez une nouvelle ligne. Vous aurez toujours la même valeur pour toutes les lignes.

Vous pouvez utiliser une fonction qui prend en paramètre le TempPoID en tant que colonne calculée.

CREATE FUNCTION GetIdentity(@P int) 
RETURNS INT AS 
BEGIN 
    RETURN (SELECT rn 
      FROM (SELECT TempPoID, 
         ROW_NUMBER() OVER(ORDER BY TempPoID ASC) AS rn 
       FROM tblTempPo) AS T 
      WHERE TempPoID = @P) 
END 

Tableau Définition:

CREATE TABLE [dbo].[tblTempPo](
    [TempPoID] [int] IDENTITY(1,1) NOT NULL primary key, 
    [guid] as dbo.GetIdentity(TempPoID), 
    [Qty] [int] NULL, 
    [MobileBrandID] [int] NULL, 
    [MobileID] [int] NULL 

Je n'ai jamais utilisé ce donc je ne peux vous dire si elle est une bonne chose à faire ou non. Il pourrait être dévastateur pour vos performances de requête, je ne sais pas.

0

C'est pas une bonne idée, mais si vous avez vraiment besoin, essayez déclencheur:

create table [dbo].[tblTempPo](
[TempPoID] [int] identity(1,1) NOT NULL, 
[guid] int, 
[Qty] [int] NULL, 
[MobileBrandID] [int] NULL, 
[MobileID] [int] NULL 
) 
go 

create trigger [dbo].[tblTempPo_Trig] on [dbo].[tblTempPo] instead of insert as 
declare @cnt int 
select @cnt = count(*) 
from [dbo].[tblTempPo] with(nolock) 
insert into [dbo].[tblTempPo]([guid], [Qty], [MobileBrandID], [MobileID]) 
select @cnt+row_number() over (order by [TempPoID]), [Qty], [MobileBrandID], [MobileID] from inserted 
go 

insert into [dbo].[tblTempPo]([Qty], [MobileBrandID], [MobileID]) values (0, 0,0), (0, 0,0), (0, 0,0), (0, 0,0) 
insert into [dbo].[tblTempPo]([Qty], [MobileBrandID], [MobileID]) values (0, 0,0), (0, 0,0), (0, 0,0), (0, 0,0) 

select * from [dbo].[tblTempPo] 

go 
drop table [dbo].[tblTempPo] 
go 
Questions connexes