| 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 publicngon" >>outfile
  close(outfile)
}
//***** Object:/ {
  #upon matcing the "object" comment, close off the previous output file
  print "grant "grant" on "arr[1]" to publicngon" >>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]"')ntexec('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] = %sn", 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
}