2011-02-06 13 views
7

Tenemos un tipo de datos definido por el usuario de YesNo que tiene un que es un alias para char (1). El tipo tiene una regla unida (debe ser Y o N) y un valor predeterminado (N).Reemplazo del tipo definido por el usuario de SQL Server obsoleto con una regla vinculada y predeterminado

El objetivo de esto es que cuando cualquiera de los equipos de desarrollo cree un campo nuevo de tipo Sí, la regla y el valor predeterminado se unan automáticamente a la nueva columna.

Las reglas y los valores predeterminados han quedado obsoletos y no estarán disponibles en el próximo una versión futura de SQL Server, ¿hay alguna otra forma de lograr la misma funcionalidad?

Debo agregar que soy consciente de que podría usar restricciones CHECK y DEFAULT para replicar la funcionalidad de los objetos Rule Rule y Defalut, sin embargo, estos deberían aplicarse en cada uso del tipo, en lugar de obtener el funcionalidad 'gratis' mediante el uso de un UDT que tiene una regla y un valor predeterminado.

La publicación se refiere a una base de datos que respalda una aplicación existente, en lugar de un desarrollo nuevo, por lo que soy consciente de que nuestro uso de UDT es menos que óptimo.

Sospecho que la respuesta a la pregunta es 'No', sin embargo, normalmente cuando las características están en desuso suele haber una sintaxis alternativa que se puede usar como reemplazo, así que quería plantear la pregunta en caso de que alguien supiera alternativa.

+0

Creo que leyó mal el artículo. CREATE RULE y CREATE DEFAULT están en desuso en favor de especificar DEFAULT y reglas CHECK dentro de las sentencias CREATE TABLE o ALTER TABLE. – Bill

+0

que es donde siempre declaro el mío. –

+0

... los valores predeterminados es –

Respuesta

2

predeterminado y restricciones de comprobación ...

CREATE TABLE foo (
    col1 int... 
    YesNo char(1) NOT NULL DEFAULT ('N') 
        CONSTRAINT CK_foo_YesNo CHECK (YesNo IN 'Y', 'N')) 
    col2 ... 
    ) 

Personalmente, tiendo a no utilizar UDT (la última vez fue de SQL Server 6.5 IIRC), ya que no hay ningún tipo de ALTER en el caso de que algo cambia ...

en cuanto a la desaprobación ..

La primera mención en CREATE RULE para SQL Server 2005. por lo tanto, nos dijeron 6 años y hace

3 lanzamientos para SQL Server 2000 ...

"Las reglas, una característica de compatibilidad con versiones anteriores, realizan algunas de las mismas funciones que las restricciones de verificación. Las restricciones CHECK, creadas con la palabra clave CHECK de ALTER o CREATE TABLE, son las preferidas, de forma estándar ..."

Lo mismo se aplica a CREATE DEFAULT, la objeto no la restricción

Eso fue hace 11 años

+0

Me encantaría deshacerme de los UDT también, pero en este caso son útiles y son parte de esta base de datos particular que existe desde hace mucho tiempo. Sé que podría actualizar cada uso del tipo para tener una restricción y un valor predeterminado, sin embargo, eso significa aplicar una restricción y un valor predeterminado cada vez que se utiliza el tipo, lo que estaba preguntando es si hay una forma de lograr lo que tenemos en este momento, está teniendo un tipo que viene con un valor predeterminado y que solo puede aceptar ciertos valores sin el código de anding en cada uso individual. –

+0

@ Adam Jones: no es exactamente lo que quiere, pero ¿ha pensado en usar un bit no nulo y cambiar a Y o N en el cliente? De esta forma, es un tipo de datos nativo con una restricción "incorporada" de solo 2 valores. Ad interim, puede usar una columna calculada para proporcionar Y o N para lectura: solo tiene que cambiar sus escrituras a bit. – gbn

+0

Gracias por la sugerencia, es una posibilidad para el futuro. En algún momento me gustaría quitar todos los UDT y cambiar el YesNo para que sea un bit no nulo estaría en la lista de TODO. La pregunta fue realmente un punto de curiosidad. Había buscado un reemplazo para nuestra funcionalidad actual y no pude encontrar nada. Puse la pregunta aquí en caso de que hubiera algo que me hubiera perdido. Desafortunadamente, sospecho que la breve respuesta a mi pregunta es 'No'. –

0

"reglas y valores predeterminados han quedado en desuso y no estará disponible en la próxima versión de SQL Server"

1) Por lo que yo sé que no es cierto. ¡No se puede romper repentinamente el 99.9% de TSQL!

2) Además, incluso si fuera cierto (y creo firmemente que no lo es), obsoleto no significa eliminarlo en la próxima versión, simplemente que una función ya no se debe usar en el nuevo código.

¿Tiene un enlace oficial a dicho anuncio?

El usuario @gbn parece pensar que defiendo el uso de construcciones obsoletas. No soy.

+0

[CREATE RULE] (http://msdn.microsoft.com/en-us/library/ms188064 (SQL.90) .aspx) para SQL Server 2005. Solo ha tenido 6 años y 3 lanzamientos. Para [SQL Server 2000] (http://msdn.microsoft.com/en-us/library/aa258252 (SQL.80) .aspx) ... "Las reglas, una característica de compatibilidad con versiones anteriores, realizan algunas de las mismas funciones que check constraints. Las restricciones CHECK, creadas usando la palabra clave CHECK de ALTER o CREATE TABLE, son la forma preferida, estándar ... "Eso es 11 años ... – gbn

+0

@gbn: ¿su punto es? –

+0

Al abordar estos en su respuesta: "¿Tiene un enlace oficial a dicho anuncio?" y "Por lo que sé, eso no es verdad. ¡No se puede romper el 99.9% de TSQL de repente!". Has tenido bolsas de tiempo para ajustar ... – gbn

0

Xquery es un poco obtuso a utilizar para algo tan simple. Normalmente lo uso para una tipificación de datos más compleja, pero responde (creo) a tu pregunta sobre un reemplazo. Aquí es cómo podría implementar un parámetro como tipeado xml que debe ser verdadero o falso. Puedes extenderlo para que sea sí/no o cachorro/gatito o lo que quieras.

if schema_id(N'chamomile') is null 
    execute (N'create schema chamomile'); 
go 
set nocount on; 
go 
/* 
    All content is licensed as [chamomile] (http://www.katherinelightsey.com/#!license/cjlz) and 
    copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved, 
    and as open source under the GNU Affero GPL (http://www.gnu.org/licenses/agpl-3.0.html). 
    --------------------------------------------- 
*/ 
if exists 
    (select xml_collection_id 
    from sys.xml_schema_collections as true_false 
    where true_false.name = 'true_false' 
      and true_false.schema_id = schema_id(N'chamomile')) 
    drop xml schema collection [chamomile].[true_false]; 
go 
/* 
    -- 
    -- License 
    ---------------------------------------------------------------------- 
    Katherine E. Lightsey 
    http://www.katherinelightsey.com 

    All content is copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved, 
    licensed as [chamomile] (http://www.katherinelightsey.com/#!license/cjlz) and copyright Katherine Elizabeth Lightsey, 1959-2014 (aka; my life), all rights reserved, 
    and as open source under the GNU Affero GPL (http://www.gnu.org/licenses/agpl-3.0.html). 

    -- 
    -- to view documentation 
    ----------------------------------------------------------------------------------------------- 
    select objtype 
     , objname 
     , name 
     , value 
    from fn_listextendedproperty (null 
        , 'schema' 
        , 'chamomile' 
        , 'xml schema collection' 
        , 'true_false' 
        , default 
        , default); 
*/ 
create xml schema collection [chamomile].[true_false] as N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:chamomile="http://www.katherinelightsey.com/" targetNamespace="http://www.katherinelightsey.com/"> 

    <xsd:element name="true_false" type="chamomile:true_false_type" /> 

    <xsd:complexType name="true_false_type"> 
     <xsd:complexContent> 
     <xsd:restriction base="xsd:anyType"> 
      <xsd:attribute name="true_false" type="chamomile:pass_fail_enumeration" default="false" /> 
     </xsd:restriction> 
     </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:simpleType name="pass_fail_enumeration"> 
    <xsd:restriction base="xsd:NMTOKEN"> 
     <xsd:enumeration value="true" /> 
     <xsd:enumeration value="false" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

</xsd:schema>'; 
go 
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="true" />'; 
if (select @true_false.value(N'(/*/@true_false)[1]', N'[sysname]')) 
    = N'true' 
    select N'true'; 
go 
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="false" />'; 
go 
declare @true_false xml([chamomile].[true_false]) = N'<chamomile:true_false xmlns:chamomile="http://www.katherinelightsey.com/" true_false="not_valid" />'; 
go 
Cuestiones relacionadas