1

employee次の列を持つ名前のテーブルがあります。

empid int (autoincrement,PK), 
empname varchar,
imagepath varchar

empid、、、empnameを挿入したいimagepath画像名は、次のような自動インクリメントIDの値にする必要があります~/images/1.jpg(ここで、1はその行の自動インクリメントIDです)

これは完璧なコードかどうか???

insert into employee (name, path) 
values
(
 'sarju',
 (select '~/images/'+Cast(ISNULL(max(empid),0)+1 as varchar(50))+'.jpg' from emp)
)
4

5 に答える 5

3

MAX(ID)+1 は次の自動インクリメント値と異なる可能性があるため、完全なコードではありません。IDENT_CURRENT 関数を使用できます

INSERT INTO employee (name,path) 
SELECT 'sarju','~/images/'+CAST(IDENT_CURRENT('employee') AS VARCHAR(50))+'.jpg'
于 2013-04-16T13:45:29.987 に答える
1

多くの人がトリガーを好まないので、私はこれにうんざりするかもしれませんが、これはトリガーが何のために構築されたかの完璧な例です (そして、私は正直に世界にそれを知ってもらいたいです):

CREATE TRIGGER update_imagepath ON dbo.employee FOR insert AS

UPDATE employee
SET imagepath = '~/images/' + CAST((SELECT empid FROM inserted) AS VARCHAR) + '.jpg'
WHERE empid = (SELECT empid FROM inserted)

それらは目的を果たしており、このようなものはまさにそれです。INSERTほら、従業員の名前が必要なだけで、TRIGGER自動的に実行されます。これは正直なところ、これを処理する最も簡単な方法です。これのもう 1 つの利点は、大量の従業員を一括挿入したり、Management Studio から挿入ステートメントを実行したりした場合でも、トリガーが実行されることです。INSERTそのクレイジーなステートメントを掘り下げる必要はありません。

于 2013-04-16T13:39:31.527 に答える
1

insert into employee (name,path) values('sarju',(select '~/images/'+Cast(ISNULL(max(empid),0)+1 as varchar(50))+'.jpg' from emp) )

はい、可能です

于 2013-04-16T13:38:34.953 に答える
0

編集:これは機能しますが、Nenad Zivkovics ソリューションの方が優れていると言わざるを得ません。

SCOPE_IDENTITY() を使用して、作成された最新の ID を取得できます。また、間違ったIDを取得しないように、より安全になります。

insert into employee (name) 
values ( 'sarju')

declare @employeeId as int = SCOPE_IDENTITY()

update employee set 
path = '~/images/' + cast(@employeeId as varchar(50)) + '.jpg' 
where empid = @employeeId
于 2013-04-16T13:47:59.567 に答える
0

画像を保存する特定のフォルダーが1つしかない場合は、フィールドimagepathを計算済みにすることができます

CREATE TABLE employee 
(
    empid int IDENTITY(1,1) NOT NULL,
    empname VARCHAR(50) NOT NULL,
    imagepath AS ('~/images/'+cast(empid AS VARCHAR(50))+'.jpg')
)

INSERT INTO employee (empname) 
VALUES ('sarju')
INSERT INTO employee (empname) 
VALUES ('sarju2')
于 2013-04-16T13:48:27.713 に答える