2013-07-05 2 views
3

DDL:Как я взять последний вставленный PK вычислен VARCHAR (7) поле вывода

CREATE TABLE [dbo].[Admin_Profile](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Ad_Regid] AS ('R'+right('200'+CONVERT([varchar](10),[ID],(0)),(6))) PERSISTED NOT NULL, 
    [Ad_Fname] [varchar](25) NULL, 
    [Ad_Lname] [varchar](25) NULL, 

CONSTRAINT [PK_Admin_Profile] PRIMARY KEY CLUSTERED 
(
    [Ad_Regid] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

SP:

create procedure _insertAdminProfile 
(
    @Ad_Fname varchar(25), 
    @Ad_Lname varchar(25), 
    @Ad_Pwd varchar(7) Out 
    as 

    Begin 

    insert into dbo.Admin_Profile (Ad_Fname,Ad_Lname) values (@Ad_Fname,@Ad_Lname); 

    SELECT ISNULL(MAX(@Ad_Pwd), 0) + 1 FROM dbo.Admin_Profile 

    end 

Я пытался много способов, чтобы получить выход inserted.Ad_Regid .. . Не получая, я попробовал выбрать @Ad_Regid = SCOPE_IDENTITY() тоже.

Спасибо ...

ответ

1

Попробуйте эти три варианта к вашему выбору -

1:

CREATE PROCEDURE _insertAdminProfile 
(
    @Ad_Fname VARCHAR(25), 
    @Ad_Lname VARCHAR(25), 
    @Ad_Pwd VARCHAR(7) OUTPUT 
) 
AS BEGIN 

    INSERT INTO dbo.Admin_Profile (Ad_Fname, Ad_Lname) 
    VALUES (@Ad_Fname, @Ad_Lname) 

    SELECT @Ad_Pwd = [Ad_Regid] 
    FROM dbo.Admin_Profile 
    WHERE [ID] = SCOPE_IDENTITY() 

END 

2:

CREATE PROCEDURE _insertAdminProfile 
(
    @Ad_Fname VARCHAR(25), 
    @Ad_Lname VARCHAR(25), 
    @Ad_Pwd VARCHAR(7) OUTPUT 
) 
AS BEGIN 

    INSERT INTO dbo.Admin_Profile (Ad_Fname, Ad_Lname) 
    VALUES (@Ad_Fname, @Ad_Lname) 

    SELECT @Ad_Pwd = 'R' + RIGHT('200'+CONVERT(VARCHAR(10),SCOPE_IDENTITY(),0), 6) 

END 

3:

CREATE PROCEDURE _insertAdminProfile 
(
    @Ad_Fname VARCHAR(25), 
    @Ad_Lname VARCHAR(25), 
    @Ad_Pwd VARCHAR(7) OUTPUT 
) 
AS BEGIN 

    DECLARE @MyTableVar TABLE (Ad_Pwd VARCHAR(7)); 

    INSERT INTO dbo.Admin_Profile (Ad_Fname, Ad_Lname) 
    OUTPUT INSERTED.Ad_Regid INTO @MyTableVar 
    VALUES (@Ad_Fname, @Ad_Lname) 

    SELECT @Ad_Pwd = Ad_Pwd 
    FROM @MyTableVar 

END 
+0

Я хочу вернуть поле, вычисленное поле varchar ... not identity (int) ... Кажется, он возвращает целочисленное значение .... – user72

+1

Конечно! Я смотрю на это ... Спасибо u @Devart – user72

+0

Добро пожаловать @Sugu. – Devart

0

Вы пытались использовать глобальный varaibale @@ IDENTITY?

CREATE PROCEDURE _insertAdminProfile 
(
    @Ad_Fname VARCHAR(25), 
    @Ad_Lname VARCHAR(25), 
    @ident NUMERIC OUT 
) 
AS BEGIN 

    INSERT INTO dbo.Admin_Profile (Ad_Fname, Ad_Lname) 
    VALUES (@Ad_Fname, @Ad_Lname); 

    SET @ident = @@IDENTITY; 

END 
+0

может вернуть значение для вычисленного varchar? – user72

+0

@Sugu, я очень сильно сомневаюсь в этом. '@@ IDENTITY' и' SCOPE_IDENTITY() 'почти равны. – Devart

+0

Пожалуйста, разместите сценарий создания таблицы. Тогда я могу помочь с этим. – Bedabrata

2

Вы должны использовать OUTPUT пункт:

DECLARE @OutputValues TABLE (ID INT, RegID VARCHAR(7)) 

INSERT INTO dbo.Admin_Profile (Ad_Fname, Ad_Lname) 
OUTPUT Inserted.Id, Inserted.Ad_RegId INTO @OutputValues(ID, RegID) 
VALUES(@Ad_Fname, @Ad_Lname); 

После того, как ваша команда вставки закончилась, вы будете иметь все вставлено ID и соответствующие Ad_RegId значения внутри таблицы переменной @OutputValues

SELECT ID, RegID FROM @OutputValues 

Подробнее о OUTPUT clause on SQL Server Books Online