SQL Server - Cómo asociar el campo de una tabla con su valor por defecto

 
Vista:
sin imagen de perfil

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Franklin (5 intervenciones) el 21/03/2017 17:17:45
Estoy haciendo una consulta grande para generar un diccionario de datos, donde estoy indicando a cada campo de la tabla si es fk, pk, si tuviera designado un valor por default (CONSTRAINT-- DEFAULT()). Y es en este último que no puedo asociar el campo con su posible valor por default (si es que lo tuviese).
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Isaias (4557 intervenciones) el 21/03/2017 18:13:38
El "asociar" el valor DEFAULT (Constraint - default), no se hace durante el SELECT, si no, durante el INSERT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Franklin (5 intervenciones) el 21/03/2017 22:11:57
Bueno, entonces cómo podría decir para que en la consulta me salga el campo de la tabla con su valor por defecto asociado, repito, solo si es que tuviese uno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Isaias (4557 intervenciones) el 21/03/2017 22:56:10
SQL, no es todo lo inteligente que quisieramos

Cuando tu defines un valor DEFAULT en una columna, el INSERT debe hacer mencion de ese DEFAULT si no trajeses un valor a insertar

Suponiendo que en la siguiente tabla el default para calificacion, ni no trae un valor fuera 5, entonces en el inserte haria esto

1
2
3
4
5
6
7
8
9
CREATE PROCEDURTE sp_InsertaCalificaicion
@idAlumno int,
@materia varchar(50),
@calificacion
AS
SET NOCOUNT ON
 
INSERT INTO ALUMNO (idAlumno, materia, calificacion)
VALUES (@idAlumno, @materia, isnull(@calificacion, default)  --Aqui la palabra default, tomara el valor DEFAULT en caso de venir null
¿Me explique?

Claro que cuando yo haga un SELECT, me traera el valor si es que se ingreso o bien el valor DEFAULT asignado al momento de la inserccion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Franklin (5 intervenciones) el 22/03/2017 16:54:34
Me parece que no me estoy dejando entender. Estoy haciendo un diccionario de datos de varias tablas y sus columnas respectivas, la consulta me tiene que arrojar el tipo de dato, la longitud, la descripción, si es PK, FK, si es nulleable, y si TIENE ALGÚN valor por DEFAULT. No sé si ahora se me entiende.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Cómo asociar el campo de una tabla con su valor por defecto

Publicado por Isaias (4557 intervenciones) el 22/03/2017 17:10:34
Ahora si te EXPLICASTE:

Hay varias forma de emitir un diccionario de datos :

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
SELECT
	d.[primary key],
	d.[foreign key],
	CASE
		WHEN LEN(d.[column]) = 0 THEN d.[table]
		ELSE ''
	END	AS [table],
	d.[column],
	CAST(d.[description] AS VARCHAR(MAX)) AS [description],
	d.[data type],
	d.nullable,
	d.[identity],
	d.[default]
FROM
	(
		SELECT
			'' AS [primary key],
			'' AS [foreign key],
			s.[name] AS [schema],
			CASE
				WHEN s.[name] = 'dbo' THEN t.[name]
				ELSE s.[name] + '.' + t.[name]
			END AS [table],
			'' AS [column],
			ISNULL(RTRIM(CAST(ep.[value] AS NVARCHAR(4000))), '') AS [description],
			'' AS [data type],
			'' AS nullable,
			'' AS [identity],
			'' AS [default],
			NULL AS column_id
		FROM
			sys.tables t
 
				INNER JOIN sys.schemas s ON
					s.[schema_id] = t.[schema_id]
 
				-- get description of table, if available
				LEFT OUTER JOIN sys.extended_properties ep ON
					ep.major_id = t.[object_id] AND
					ep.minor_id = 0 AND
					ep.name = 'MS_Description' AND
					ep.class = 1
		WHERE
			t.is_ms_shipped = 0 AND
			NOT EXISTS
			(
				SELECT *
				FROM
					sys.extended_properties ms
				WHERE
					ms.major_id = t.[object_id] AND
					ms.minor_id = 0 AND
					ms.class = 1 AND
					ms.[name] = 'microsoft_database_tools_support'
			)
 
		UNION ALL
 
		SELECT
			CASE
				WHEN pk.column_id IS NOT NULL THEN 'PK'
				ELSE ''
			END AS [primary key],
			CASE
				WHEN fk.primary_table IS NOT NULL
					THEN fk.primary_table + '.' + fk.primary_column
				ELSE ''
			END AS [foreign key],
			s.[name] AS [schema],
			CASE
				WHEN s.[name] = 'dbo' THEN t.[name]
				ELSE s.[name] + '.' + t.[name]
			END AS [table],
			c.[name] AS [column],
			ISNULL(RTRIM(CAST(ep.[value] AS NVARCHAR(4000))), '') AS [description],
			CASE
				WHEN uty.[name] IS NOT NULL THEN uty.[name]
				ELSE ''
			END +
				CASE
					WHEN uty.[name] IS NOT NULL AND sty.[name] IS NOT NULL THEN '('
					ELSE ''
				END +
				CASE
					WHEN sty.[name] IS NOT NULL THEN sty.[name]
					ELSE ''
				END +
				CASE
					WHEN sty.[name] IN ('char', 'nchar', 'varchar', 'nvarchar', 'binary', 'varbinary')
						THEN '(' +
							CASE
								WHEN c.max_length = -1 THEN 'max'
								ELSE
									CASE
										WHEN sty.[name] IN ('nchar', 'nvarchar')
											THEN CAST(c.max_length / 2 AS VARCHAR(MAX))
										ELSE
											CAST(c.max_length AS VARCHAR(MAX))
									END
							END
							 + ')'
					WHEN sty.[name] IN ('numeric', 'decimal')
						THEN '(' +
							CAST(c.precision AS VARCHAR(MAX)) + ', ' + CAST(c.scale AS VARCHAR(MAX))
							 + ')'
					ELSE
						''
				END +
				CASE
					WHEN uty.[name] IS NOT NULL AND sty.[name] IS NOT NULL THEN ')'
					ELSE ''
				END	AS [data type],
			CASE
				WHEN c.is_nullable = 1 THEN 'Y'
				ELSE ''
			END AS nullable,
			CASE
				WHEN c.is_identity = 1 THEN 'Y'
				ELSE ''
			END AS [identity],
			ISNULL(dc.[definition], '') AS [default],
			c.column_id
		FROM
			sys.columns c
				INNER JOIN sys.tables t ON
					t.[object_id] = c.[object_id]
 
				INNER JOIN sys.schemas s ON
					s.[schema_id] = t.[schema_id]
 
				-- get name of user data type
				LEFT OUTER JOIN sys.types uty ON
					uty.system_type_id = c.system_type_id AND
					uty.user_type_id = c.user_type_id AND
					c.user_type_id <> c.system_type_id
 
				-- get name of system data type
				LEFT OUTER JOIN sys.types sty ON
					sty.system_type_id = c.system_type_id AND
					sty.user_type_id = c.system_type_id
 
				-- get description of column, if available
				LEFT OUTER JOIN sys.extended_properties ep ON
					ep.major_id = t.[object_id] AND
					ep.minor_id = c.column_id AND
					ep.[name] = 'MS_Description' AND
					ep.[class] = 1
 
				-- get defaults code text
				LEFT OUTER JOIN sys.default_constraints dc ON
					dc.parent_object_id = t.[object_id] AND
					dc.parent_column_id = c.column_id
 
				-- check for inclusion in primary key
				LEFT OUTER JOIN
				(
					SELECT
						ic.column_id,
						i.[object_id]
					FROM
						sys.indexes i
							INNER JOIN sys.index_columns ic ON
								ic.index_id = i.index_id AND
								ic.[object_id] = i.[object_id]
					WHERE
						i.is_primary_key = 1
				) pk ON
					pk.column_id = c.column_id AND
					pk.[object_id] = t.[object_id]
 
				-- check for inclusion in foreign key
				LEFT OUTER JOIN
				(
					SELECT
						CASE
							WHEN s.[name] = 'dbo' THEN pk.[name]
							ELSE s.[name] + '.' + pk.[name]
						END AS primary_table,
						pkc.[name] as primary_column,
						fkc.parent_object_id,
						fkc.parent_column_id
					FROM
						sys.foreign_keys fk
							INNER JOIN sys.tables pk ON
								fk.referenced_object_id = pk.[object_id]
							INNER JOIN sys.schemas s ON
								s.[schema_id] = pk.[schema_id]
							INNER JOIN sys.foreign_key_columns fkc ON
								fkc.constraint_object_id = fk.[object_id] AND
								fkc.referenced_object_id = pk.[object_id]
							INNER JOIN sys.columns pkc ON
								pkc.[object_id] = pk.[object_id] AND
								pkc.column_id = fkc.referenced_column_id
				) fk ON
					fk.parent_object_id = t.[object_id] AND
					fk.parent_column_id = c.column_id
		WHERE
			t.is_ms_shipped = 0 AND
			NOT EXISTS
			(
				SELECT *
				FROM
					sys.extended_properties ms
				WHERE
					ms.major_id = t.[object_id] AND
					ms.minor_id = 0 AND
					ms.class = 1 AND
					ms.[name] = 'microsoft_database_tools_support'
			)
	) d
ORDER BY
	d.[schema],
	d.[table],
	d.column_id;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar