Defaultwerte für Spalten setzen bei MS-SQL

Reinhard Jung, Senior Webapplication-Entwickler, bis Ende 2010

Auch im MS-SQL Server kann man alle Meta-Daten einer Tabelle abfragen – bis auf die DefaultValues.

Das Script prüft, ob es die benötigten Felder einer Tabelle gibt und diese auch den gewünschten DefaultValue haben. Andernfalls werden die Werte gesetzt.

1<cfset local = structNew() />
2<cfset local.db.name = "reinhards" />
3<!--- Name der Tabelle --->
4<cfset local.db.table = "users" />
5<!--- idxOO,idxMM,intSS,idxDD = idxOnline,idxMail,intStatus,idxDelete --->
6<cfset local.db.columns = "idxOO=1,idxMM=1,intSS=0,idxDD=0" />
7
8<!--- Gibt es das Feld in der Tabelle --->
9<cfquery name="local.fieldExists" datasource="#local.db.name#">
10 SELECT * FROM #local.db.table#
11</cfquery>
12
13<cfloop list="#local.db.columns#" index="local.myField">
14 <cfif listFindNoCase(local.fieldExists.ColumnList,listFirst(local.myField,'=')) >
15 <!--- Wenn Ja: Hat es bereits einen DefaultValue --->
16 <cfquery name="local.isDefaultDefined" datasource="#local.db.name#">
17 SELECT cdefault,id AS TableID FROM SYSCOLUMNS
18 WHERE ID = SELECTT id FROM SYSOBJECTS WHERE name = '#local.db.table#')
19 AND name = '#listFirst(local.myField,'=')#'
20 </cfquery>
21
22 <cfif local.isDefaultDefined.recordCount AND local.isDefaultDefined.cDefault GT 0>
23 <!--- Default gibt es: Droppen --->
24 <!--- Namen holen --->
25 <cfquery name="local.getDefaultName" datasource="#local.db.name#">
26 SELECT name FROM SYSOBJECTS
27 WHERE id = SELECTT cdefault FROM SYSCOLUMNS
28 WHERE id = SELECTT id FROM SYSOBJECTS WHERE name = '#local.db.table#')
29 AND name = '#listFirst(local.myField,'=')#')
30 </cfquery>
31 <!--- und das Feld droppen --->
32 <cfquery datasource="#local.db.name#">
33 ALTER TABLE #local.db.table# DROP CONSTRAINT #local.getDefaultName.name#
34 </cfquery>
35 </cfif>
36 <!--- DefaultValue setzen --->
37 <cfquery datasource="#local.db.name#">
38 ALTER TABLE #local.db.table#
39 ADD CONSTRAINT DF_#replace(createUUID(),'-','_','all')#
40 DEFAULT (#listLast(local.myField,'=')#) FOR #listFirst(local.myField,'=')#
41 </cfquery>
42
43<cfelse>
44 <!--- Wenn Nein, dann Feld anlegen und DefaultValue setzen --->
45 <cfquery datasource="#local.db.name#" name="local.addConstraint">
46 ALTER TABLE #local.db.table#
47 ADD #listFirst(local.myField,'=')# BIT NULL
48 CONSTRAINT DF_#replace(createUUID(),'-','_','all')#
49 DEFAULT (#listLast(local.myField,'=')#)
50 </cfquery>
51</cfif>
52</cfloop>