Iver's web place

Navegador de Archivos

Calendario del Blog

February 2012
Sun Mon Tue Wed Thu Fri Sat
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 1 2 3

General

SET [QUOTED_IDENTIFIER/ANSI_NULLS] ON/OFF


Existe una opción en el Management Studio de SQL Server que nos permite crear scripts de forma fácil y sencilla. Lo bonito de los scripts generados es eso, que se generan solos y con eso podemos ejecutarlos sin problemas. Sin embargo siempre nos generan algo como:


 
USE [DataBaseName]
GO
/** Object:  Table [dbo].[TableName]    Script Date: 11/15/2010 17:32:47 **/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
....
...
..
 


Y como yo soy muy curioso en esto de conocer que carambas voy a ejecutar en el servidor de SQL, se me ocurrio investigar, para que sirven los benditos ANSI_NULLS, ANSI_PADDING y QUOTED_IDENTIFIER. Los resultados fueron los siguientes:



ANSI_NULLS


Le dice al motor de SQL como debe manejar las comparaciones con los valores NULL. Cuando asignamos esta opción a ON, todas las comparaciones con NULL usando el operador = o el <> nos dará como resultado un FALSE. Lo cual está bien porque es el comportamiento definido en el estándar ISO ya que para realizar las comparaciones con NULL es necesario usar IS NULL y IS NOT NULL. Así que cuando usamos la opción con OFF nos regresara las comparaciones con los operadores = y <> realizará un comportamiento similar. De ahí la razón por la que se asigna siempre a ON al inicio del script.
Ej:



 
SET ANSI_NULLS ON
IF NULL = NULL
 PRINT 'OK'
ELSE
 PRINT 'Nada'
--R:  Nada
 
SET ANSI_NULLS ON
IF NULL IS NULL
 PRINT 'OK'
ELSE
 PRINT 'Nada'
-- R: OK
 

QUOTED_IDENTIFIER


Cuando es asignado a ON cualquier carácter que se defina con dobles comillas permite tratar los identificadores de SQL (Table, Name, Column, etc) y las reglas de T-SQL para los identificadores no serán aplicadas a estos. Además cualquier carácter que se encuentre con comillas simples ‘’ será tratado como una literal. Ej.


 
SET QUOTED_IDENTIFIER ON
CREATE TABLE "SELECT" ("TABLE" int)  -- Funciona!
 
GO
 
SET QUOTED_IDENTIFIER ON
SELECT "algo" AS Value   -- Truena, peta, da error poooorqueee “algo” no es literal
 


Sabemos que "SELECT" y "TABLE" son palabras reservadas pero aún así se crea la tabla ya que se ignoran las reglas en los nombres ... es lo mismo que cuando usamos la sintaxis:

 
CREATE TABLE [SELECT] ([TABLE] int)  -- Funciona!
 

Ahora intenta probando lo siguiente:


 
SET QUOTED_IDENTIFIER OFF
CREATE TABLE "SELECT"(TABLE” int) -- No funciona =(
 
GO
 
SET QUOTED_IDENTIFIER OFF
SELECT "algo" AS Value    -- Excelente! ahora “algo” es tratado como una literal =)
 
 

ANSI_PADDING

Controla el modo en que la columna almacena valores más cortos que el tamaño que tiene definido y cómo almacena valores con espacios en blanco a la derecha en datos de tipo char, varchar, binary y varbinary. Está opción puede ser mejor explicada con un ejemplo, que por cierto lo tomo del MSDN =P


 
PRINT 'Testing with ANSI_PADDING ON'
SET ANSI_PADDING ON;
GO
 
CREATE TABLE t1 (
   charcol CHAR(16) NULL,
   varcharcol VARCHAR(16) NULL,
   varbinarycol VARBINARY(8)
);
GO
INSERT INTO t1 VALUES ('No blanks', 'No blanks', 0x00ee);
INSERT INTO t1 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);
 
SELECT 'CHAR' = '>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
   varbinarycol
FROM t1;
GO
 
PRINT 'Testing with ANSI_PADDING OFF';
SET ANSI_PADDING OFF;
GO
 
CREATE TABLE t2 (
   charcol CHAR(16) NULL,
   varcharcol VARCHAR(16) NULL,
   varbinarycol VARBINARY(8)
);
GO
INSERT INTO t2 VALUES ('No blanks', 'No blanks', 0x00ee);
INSERT INTO t2 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);
 
SELECT 'CHAR' = '>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
   varbinarycol
FROM t2;
GO
 
DROP TABLE t1
DROP TABLE t2
 
NOTA: En una versión futura de Microsoft SQL Server ANSI_PADDING siempre estará establecida en ON y cualquier aplicación que establezca de forma explícita la opción en OFF generará un error.

Abur!

Para saber más

Trackback URI: http://es.iver.com.mx/index.php/trackback/176

Dejar un comentario

Escribe el código Captcha que estás viendo

Fuentes XML de comentario: RSS | Atom

Estadísticas de visitantes

5
54
27817