Split the output from SQL Server Management Studio (SSMS) > View > Object Explorer Details > “Script {function|view|procedure} as” into individual files
Note: The current RegEx’s are tailored around the following scripting options (see comments to change):
- “Include descriptive headers” = true (this is the default after SSMS 2008 install) – located under: SSMS > Tools > Options > SQL Server Object Explorer > Scripting > General scripting options)
- “Schema qualify object names” = false (NOT the default) - under: … > Object scripting options
Download GAWK.exe for Windows:
link1,
link2
# example: gawk -f sqlsplit.awk file-to-split.sql
BEGIN {
outfile = "erase_me.sql" #start off with a dummy file to get the ball rolling
IGNORECASE = 1
}
END {
#close off last file
print "grant "grant" on "arr[1]" to public\ngo\n" >>outfile
close(outfile)
}
/\/***** Object:/ {
#upon matcing the "object" comment, close off the previous output file
print "grant "grant" on "arr[1]" to public\ngo\n" >>outfile
close(outfile)
#start up the new one
match($0, /\[(.*)\]/, arr) #change to something like /\[dbo\]\.\[(.*)\]/ if you want “Schema qualify object names” enabled
outfile = arr[1]".sql"
print "--$Author:$\n--$Date:$\n--$Modtime:$\n--$History:$\n" > outfile
}
/^(create) +(proc|function|view)/ {
grant = "execute"
if ($2 == "view") grant = "select"
printf "if not exists(select 1 from sysobjects where name = '"arr[1]"')\n\texec('create "$2" "arr[1] >>outfile
# function is a little trickier because it could be a table or scalar return type requiring slightly different create function signature
if ($2 == "function") {
lines = ""
while((getline line) >0) {
lines = lines line"\n"
match(line, /returns/, a)
if (a[0] != "returns") { continue }
#debug: printf "line = %s, a[0] = %s, a[1] = %s, a[2] = %s, a[3] = %s\n", line, a[0], a[1], a[2], a[3]
match(line, /table/, a)
if (a[0] == "table") {
grant = "select"
print "() returns table as return select 1 as one')" >>outfile }
else print "() returns int begin return 0 end')" >>outfile
break
}
}
#proc/view
else {
print " as select 1 as one')" >>outfile
}
print "GO" >>outfile
sub(/create/, "alter") #change the create to alter
sub(/$/, lines) #tack back on the lines "eaten" to figure out whether function was tabular or scalar
}
{
print >>outfile
}