2

に次の表があります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
)

新しい行が追加されるたびに、列にinsert電流を流す必要があります。以下を使用しようとしましたが、期待どおりに機能しません。row numberguidfunction

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

3 に答える 3

1

関数はおそらく常に 1 を返しますが、句なしでGetIdentity()使用しているため、確実ではありません。 によって返される最大値が必要な場合は、追加する必要があります。これは、 を実行するのと同じです。 select top 1...order by
row_number()order by 1 descSELECT count(*) from tblTempPo

そのような修正は、新しい行を挿入するときではなく、テーブルをクエリするたびに評価される計算列を提供するGetIdentity()ため、状況ではあまり役に立ちません。すべての行で常に同じ値になります。[guid] AS ([dbo].[GetIdentity]())

TempPoIDをパラメータとして受け取る関数を計算列として使用できます。

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

テーブル定義:

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

私はこれを使用したことがないので、それが良いことかどうかはわかりません. クエリのパフォーマンスに壊滅的な影響を与える可能性がありますが、わかりません。

于 2012-01-25T09:57:10.507 に答える
0

コメントに同意します。GUID列の名前を変更する必要があります。本当にTempPoID列を2回保存する必要がある場合は、計算列を使用してください。例:

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

より複雑なアプローチが必要な場合は、トリガーを使用してください。

于 2012-01-25T09:05:51.797 に答える
0

それはすべて良い考えではありませんが、本当に必要な場合は、トリガーを試してください:

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
于 2013-02-13T14:42:24.347 に答える