Pregunta

Tengo una tabla donde los resultados se ordenan mediante una "ORDEN" de la columna, por ejemplo:

Doc_Id    Doc_Value   Doc_Order
1         aaa         1
12        xxx         5
2         bbb         12
3         ccc         24

Mi problema es que inicialmente esta columna orden de la forma más eficiente y reusably como sea posible.

Mi primera toma fue para configurar una función escalar que podría ser utilizado como un valor predeterminado cuando se agrega una nueva entrada a la tabla:

ALTER FUNCTION [dbo].[Documents_Initial_Order] 
( )
RETURNS int
AS
BEGIN

RETURN (SELECT ISNULL(MAX(DOC_ORDER),0) + 1 FROM dbo.Documents)

Cuando un usuario desea permutar 2 documentos, que puede cambiar fácilmente el 2 órdenes.

Funciona muy bien, pero ahora tengo una segunda tabla tengo que configurar de la misma manera, y estoy seguro de que hay una manera mejor de hacerlo.Alguna idea?

¿Fue útil?

Solución

Parece que quieres una columna de identidad que puede reemplazar una vez que se obtiene el valor inicial.Una solución sería tener dos columnas, una vez que la llamada "InitialOrder", que es un incremento automático de la columna de identidad y, a continuación, una segunda columna llamada doc_order que inicialmente se establece el mismo valor que la InitialOrder campo (tal vez incluso como parte de la desencadenador de inserción o un procedimiento almacenado si usted está haciendo inserciones de esa manera), pero proporcionan al usuario la posibilidad de editar la columna.

Se requiere un extra de unos pocos bytes por registro, pero resuelve su problema, y si su valor alguno en absoluto, usted tendría tanto la inicial de orden del documento y el usuario restablecer el orden disponible.

También, no estoy seguro de si su doc_order debe ser exclusivo o no, pero si no, usted puede ordenar la devolución de valores por doc_order y InitialOrder para garantizar un rendimiento consistente de la secuencia.

Otros consejos

De acuerdo con su comentario, yo creo que hay una solución muy viable. Se podría hacer un poco más fácil de usar especificando como un defecto:

alter table documents
  add constraint constraint_name 
  default (dbo.documents_initial_order()) for doc_order

Como alternativa, puede crear un desencadenador de actualización que copia el campo de identidad al campo doc_order después de una inserción:

create trigger Doc_Trigger
on Documents
for insert
as
update d
set d.doc_order = d.doc_id 
from Documents d
inner join inserted i on i.doc_id = d.doc_id

Ejemplo definir doc_id como una columna de identidad:

create table Documents (
    doc_id int identity primary key,
    doc_order int,
    doc_value ntext
)

Si no hay necesidad de tener ningún control sobre lo que podría ser que el valor DOC_ORDER, trate de usar una columna de identidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top