Where I am mainly using Sequences, not tied to a specific field is where many entities in our application<div>all use the same number sequence to be attached a unique reference, There is a single point of entry to type in that ref# which will open anything relevant, ie an invoice, a statement a client, a debtor etc. when talking to customers on the phone, it lets the client access relevant info very quickly. I don&#39;t tend to use a database to its full capacity as a database as oracle and MSSql etc would let you.. its a hybrid between the middletier OO layer, and the database.&nbsp;</div>
<div><br></div><div>The actual stored proc I&#39;ve come up with is as follows... I&#39;m just waiting to find the flaws.. :D i think 99.999% it will work great.. all my primary keys are GUIDs.</div><div><div><br></div><div>
CREATE PROCEDURE [GETGEN] @TableName VarChar(256), @ACount Int</div><div><br></div><div>AS</div><div><br></div><div>SET NOCOUNT ON</div><div>DECLARE @AVALUE Int</div><div>BEGIN TRAN</div><div><br></div><div>DECLARE @Res TABLE ( ID int )</div>
<div><br></div><div>BEGIN</div><div>&nbsp;&nbsp;UPDATE GEN_IDTABLE with (XLOCK,ROWLOCK)</div><div>&nbsp;&nbsp;SET KEYVALUE = @AVALUE+@ACOUNT</div><div>&nbsp;&nbsp;OUTPUT deleted.KEYVALUE INTO @RES(ID)</div><div>&nbsp;&nbsp; &nbsp;WHERE KEYNAME = @TableName</div><div>
&nbsp;&nbsp;if @@ROWCOUNT = 0</div><div>&nbsp;&nbsp;begin</div><div>&nbsp;&nbsp; &nbsp;SET @AVALUE = 1</div><div>&nbsp;&nbsp; &nbsp;INSERT INTO GEN_IDTABLE (KEYNAME,KEYVALUE) VALUES (@TableName,@ACount+1);</div><div>&nbsp;&nbsp;end else</div><div>&nbsp;&nbsp;begin</div><div>&nbsp;&nbsp; &nbsp;SELECT @AVALUE=ID from @Res</div>
<div>&nbsp;&nbsp;end</div><div>END</div><div><br></div><div>COMMIT TRAN</div><div>RETURN @AVALUE</div><div><br></div></div><div><br><br><div class="gmail_quote">On Mon, Dec 1, 2008 at 9:40 PM, Neven MacEwan <span dir="ltr">&lt;<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Kyley<br>
<br>
my experience is with postgreqsl, it has sequences (I assume from its<br>
oracleness), which get tied to a column via the serial type.<br>
<br>
I&#39;m puzzled as to where you would use a Sequence/Generator in a non-pk<br>
situation, unless you<br>
are talking about your &#39;documentno&#39; column, which as shown can be done<br>
via a stored proc<br>
<br>
I wonder is mssql eventually will allow functions to update tables (or<br>
code a primative sequence generation)<br>
which would allow this<br>
<br>
Neven<br>
<div class="Ih2E3d"><br>
&gt; The main difference is that a Generator is more like an Oracle Sequence,<br>
&gt; It is table independant, which allows you to use the same sequence<br>
&gt; accross more than one table,<br>
&gt; and you can also have more than one per table. I find the identity is<br>
&gt; only useful if it is to be a primary key, not useful as a data element.<br>
&gt;<br>
&gt; On Mon, Dec 1, 2008 at 5:12 PM, Neven MacEwan &lt;<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a><br>
</div><div><div></div><div class="Wj3C7c">&gt; &lt;mailto:<a href="mailto:neven@mwk.co.nz">neven@mwk.co.nz</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt; &nbsp; &nbsp; John<br>
&gt;<br>
&gt; &nbsp; &nbsp; Really interbase generators are more akin to the mssql identity column<br>
&gt; &nbsp; &nbsp; type, the problem with mssql identity columns WAS<br>
&gt; &nbsp; &nbsp; with the @@Identity variable which was per connection (and hence<br>
&gt; &nbsp; &nbsp; triggers that inserted other identity columns not return the identity<br>
&gt; &nbsp; &nbsp; you would expect), &nbsp;this has been &#39;fixed&#39; with the<br>
&gt; &nbsp; &nbsp; SCOPE_IDENTITY() function<br>
&gt;<br>
&gt; &nbsp; &nbsp; Stangely identity columns and generators behave the same way, ie they<br>
&gt; &nbsp; &nbsp; are both not rolled back by a trans<br>
&gt;<br>
&gt; &nbsp; &nbsp; PostgeSQL, uses a combo of both a column type of &#39;serial&#39;, which auto<br>
&gt; &nbsp; &nbsp; generates a &#39;sequence&#39;<br>
&gt;<br>
&gt; &nbsp; &nbsp; Of course I could be spouting BS.<br>
&gt;<br>
&gt; &nbsp; &nbsp; Neven<br>
&gt; &nbsp; &nbsp; //<br>
&gt; &nbsp; &nbsp; &gt; Whats others opinion on the merits of trggers etc as discussed<br>
&gt; &nbsp; &nbsp; here vs the<br>
&gt; &nbsp; &nbsp; &gt; Firebird/Interbase method of using generators?<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; I have often wondered if this is an area where<br>
&gt; &nbsp; &nbsp; Firebird/Interbase has a less<br>
&gt; &nbsp; &nbsp; &gt; convenient but more transparent mechanism - where you have to fire a<br>
&gt; &nbsp; &nbsp; &gt; generator to get a new key value before you start putting data<br>
&gt; &nbsp; &nbsp; in a new<br>
&gt; &nbsp; &nbsp; &gt; record.<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; And the generator never rolls back even if the transaction does<br>
&gt; &nbsp; &nbsp; - avoiding<br>
&gt; &nbsp; &nbsp; &gt; the lock problem. &nbsp;Mostly in<br>
&gt; &nbsp; &nbsp; &gt; my experience this is fine, except some times when the ID<br>
&gt; &nbsp; &nbsp; numbers (eg batch<br>
&gt; &nbsp; &nbsp; &gt; numbers) are supposed to be strictly sequential and then you<br>
&gt; &nbsp; &nbsp; have to get the<br>
&gt; &nbsp; &nbsp; &gt; next value from a SQL query, and make sure no-one else is<br>
&gt; &nbsp; &nbsp; running another of<br>
&gt; &nbsp; &nbsp; &gt; the same batch at the same time. &nbsp;(In those situations the main<br>
&gt; &nbsp; &nbsp; thing that<br>
&gt; &nbsp; &nbsp; &gt; protects the database is that only one staff member ever runs<br>
&gt; &nbsp; &nbsp; this batch<br>
&gt; &nbsp; &nbsp; &gt; operation - I bet thats how a lot of databases run in practice)<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; John<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt; _______________________________________________<br>
&gt; &nbsp; &nbsp; &gt; NZ Borland Developers Group - Delphi mailing list<br>
</div></div>&gt; &nbsp; &nbsp; &gt; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; &gt; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; &gt; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
</div>&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt; with Subject: unsubscribe<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt; &nbsp; &nbsp; &gt;<br>
&gt;<br>
&gt; &nbsp; &nbsp; _______________________________________________<br>
&gt; &nbsp; &nbsp; NZ Borland Developers Group - Delphi mailing list<br>
</div>&gt; &nbsp; &nbsp; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a> &lt;mailto:<a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>&gt;<br>
<div class="Ih2E3d">&gt; &nbsp; &nbsp; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; &nbsp; &nbsp; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a><br>
</div>&gt; &nbsp; &nbsp; &lt;mailto:<a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a>&gt; with Subject: unsubscribe<br>
<div class="Ih2E3d">&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Kyley Harris<br>
&gt; Harris Software<br>
&gt; +64-21-671-821<br>
</div>&gt; ------------------------------------------------------------------------<br>
<div><div></div><div class="Wj3C7c">&gt;<br>
&gt; _______________________________________________<br>
&gt; NZ Borland Developers Group - Delphi mailing list<br>
&gt; Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a><br>
&gt; Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
&gt; Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe<br>
<br>
_______________________________________________<br>
NZ Borland Developers Group - Delphi mailing list<br>
Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a><br>
Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Kyley Harris<br>Harris Software<br>+64-21-671-821<br>
</div>