Paper 021-2007 
ODS Options and SAS
®
Stored Processes 
Cynthia L. Zender, SAS Institute Inc., Cary, NC 
ABSTRACT 
Are you using SAS Stored Processes in a SAS Intelligence Platform client-server environment? Do you want to 
convert existing SAS programs for use as SAS Stored Processes? This paper provides concrete examples of how to 
convert existing SAS programs to stored processes that can be executed from selected SAS Intelligence Platform 
client applications. Topics in this paper include: basic report program conversion, conversion of SAS/GRAPH
®
programs, use of macro variables in program conversion, streaming versus transient output from stored processes, 
and permanent result packages. Special emphasis is given to showing code both before and after conversion—
especially the use of Output Delivery System (ODS) options. SAS/GRAPH options are also illustrated with before-
and-after examples. In addition, there is some discussion of how different client applications accept the options and 
render output. 
INTRODUCTION 
The purpose of this paper is to show how an existing SAS program that uses ODS RTF, ODS PDF, or ODS HTML can 
be converted to execute as a SAS stored process. For the sake of brevity and ease of explanation, the ODS options 
and user-supplied parameters have been kept as simple as possible. Data from the SASHELP library has been used 
for the demonstration programs. However, the full text of the two "starter" programs is included in the Appendix. If 
you are interested in the converted programs or stored processes that were derived from these starter programs, 
you can download them from the Web site listed in the "Resources" section at the end of the paper.  
Security and authorization discussions fall outside the scope of this paper. Not every stored process author will have 
the ability to alter authorization permissions or to move stored processes around in a DEV/TEST/PROD 
environment. The paper does not discuss using the SAS
®
Enterprise Guide
®
Stored Process Wizard. The main focus 
of this paper is the code changes that must be implemented to use ODS options and SAS/GRAPH options with SAS 
Stored Processes. 
BASIC REPORT PROGRAM CONVERSION STEPS 
The basic steps for program conversion are 
1.  Have a working SAS program 
2.  Convert the SAS program to be a stored process by adding the *ProcessBody; comment and 
%STPBEGIN;/%STPEND; macro invocations in place of the ODS invocation statements 
3.  Register the stored process metadata relevant to the stored process program 
4.  Test your stored process in all client applications from which it will be executed. 
Part of the conversion process in Step 2 and the registration process in Step 3 involves understanding how user-
supplied parameter values are treated by stored processes and how ODS options need to be supplied in order to 
affect stored process results. Two programs were converted to stored processes for this paper. The first program 
contains a PROC REPORT step and a PROC TABULATE step. We will use the DEMO1_TABLE.SAS program to 
talk about simple conversion methods and we'll talk about the second program (DEMO2_HTML.SAS) when we 
discuss some of the more complex issues related to stored process conversion. 
STEP 1:  HAVE A WORKING SAS PROGRAM 
The first program, DEMO1_TABLE.SAS, contains a PROC REPORT step and a PROC TABULATE step and is 
outlined below. 
Applications Development
t
SAS Global Forum 2007
007
Pdf link - insert, remove PDF links in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Free C# example code is offered for users to edit PDF document hyperlink (url), like inserting and deleting
change link in pdf; add link to pdf file
Pdf link - VB.NET PDF url edit library: insert, remove PDF links in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Help to Insert a Hyperlink to Specified PDF Document Page
add hyperlink in pdf; add hyperlink to pdf online
%let wantreg=Canada; 
options nodate nonumber missing='0' orientation=landscape; 
ods rtf file='c:\temp\demo1.rtf' bodytitle startpage=no keepn notoc_data; 
ods pdf file='c:\temp\demo1.pdf' bookmarkgen=no compress=9 startpage=no; 
ods html file='c:\temp\demo1.html' style=sasweb rs=none; 
ods escapechar='^'; 
proc sort data=sashelp.shoes out=shoes;  by Region; 
where Region = "&wantreg"; 
run; 
**  proc report code; 
**  proc tabulate code;  
ods _all_ close; 
The macro variable, &WANTREG, is used at the highlighted places in the code to limit the program execution to only 
one REGION from the SASHELP.SHOES data set. In addition, the code uses a common ODS technique that 
produces three output files, HTML, RTF, and PDF, with only one execution of the procedure code. Each ODS 
statement uses options that are specific to that destination. 
The ODS options (other than the FILE= option) used in the program are shown in the table below. For an explanation 
of the options, refer to the Appendix.  
RTF 
PDF 
HTML 
BODYTITLE 
BOOKMARKGEN=NO 
STYLE=SASWEB 
STARTPAGE=NO 
STARTPAGE=NO 
RS=NONE 
KEEPN 
COMPRESS=9 
NOTOC_DATA 
TEXT= 
The output from the DEMO1_TABLE.SAS program is shown below (Figures 1, 2, and 3). You can see that the 
SASWEB style was used for the HTML file; the BODYTITLE option was used for the RTF file; and ODS TEXT= was 
used for the PDF file. The other options, like COMPRESS= or RS=NONE are not immediately obvious, but could be 
detected if you compared the uncompressed PDF file size with the file size of this output, or if you looked at the 
HTML source file to see that the appropriate record separators were put at the end of each line of HTML source 
code. You can also see that the LANDSCAPE orientation, which was specified in an OPTIONS statement, was used 
for the RTF and PDF files. 
Figure 1: Partial HTML Output Viewed in Internet Explorer 
Applications Development
SAS Global Forum 2007
007
RasterEdge .NET Document Imaging Trial Package Download Link.
View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.OCR. Microsoft Office. View & Process. XImage.Raster. Adobe PDF. XDoc.PDF. Scanning. XImage.
convert doc to pdf with hyperlinks; adding links to pdf in preview
C# PDF Library SDK to view, edit, convert, process PDF file for C#
RasterEdge PDF SDK for .NET package offers robust APIs for editing PDF document hyperlink (url) and quick navigation link in PDF bookmark.
add a link to a pdf file; pdf edit hyperlink
Figure 2: RTF Output in Print Preview Mode of Microsoft Word 
Figure 3: PDF Output Viewed in Adobe Acrobat Reader 7 
Now that we have a working SAS program, Step 1 is satisfied. It's time to start Step 2. 
Applications Development
SAS Global Forum 2007
007
How to C#: Basic SDK Concept of XDoc.PDF for .NET
XDoc.PDF for .NET allows C# developers to edit hyperlink of PDF document, including editing PDF url links and quick navigation link in bookmark/outline.
add hyperlink to pdf; convert excel to pdf with hyperlinks
VB.NET PDF: Basic SDK Concept of XDoc.PDF
XDoc.PDF for .NET allows VB.NET developers to edit hyperlink of PDF document, including editing PDF url links and quick navigation link in bookmark/outline.
add a link to a pdf in acrobat; adding links to pdf document
STEP 2: USE THE SAS MACRO FACILITY IN PROGRAM CONVERSION 
There are several ways that the SAS macro facility is used by stored processes. One way is through the use of the 
predefined macro programs, %STPBEGIN and %STPEND. There are macro parameters that are reserved for use with 
the %STPBEGIN and %STPEND macro programs. The various ODS options from DEMO1_TABLE.SAS fall into this 
category. You can utilize user-supplied parameter values in your stored process programs. The macro variable that 
will become the user-supplied parameter is defined in the original program %LET statement, so let's deal with that 
parameter first. 
USER-SUPPLIED PARAMETERS 
To keep the new stored process simple, there is only one input parameter, which will be used to provide a REGION 
value for the WANTREG macro variable. User-supplied parameters, like WANTREG, could have a hard-coded value in 
the stored process, could be provided using an interface within the client application, or could be provided using a 
custom-coded interface. In the original program code, the value of the WANTREG macro variable was hard-coded with 
a %LET statement. In order to change the %LET statement, a programmer or sophisticated end-user must know the 
valid values for the REGION column. However, in the SAS Intelligence Platform, the stored process author registers 
the input parameter in the metadata and can provide valid variable values. The end-user is presented with an easy-
to-use interface from which to select a valid value. 
The advantage of using input parameters is not just the flexibility that allows the stored process author to deliver 
more generic, re-usable programs. The metadata is the "boss" as far as parameter usage is concerned. It can 
contain information such as whether the parameter is required and/or modifiable, whether there are parameter value 
constraints to be enforced by the client interface, and/or whether the user can make only a single selection for 
parameter values or multiple selections. Figure 4 shows the prompting interface in SAS Enterprise Guide for the 
WANTREG parameter. The same property sheet interface is used by the SAS
®
Add-In for Microsoft Office. 
Figure 4: SAS Enterprise Guide Interface (with value choices shown) 
This parameter interface reflects the way the parameter metadata was defined within SAS
®
Management Console, 
as seen in Figure 5. 
Applications Development
SAS Global Forum 2007
007
C# Raster - Raster Conversion & Rendering in C#.NET
add links to pdf; clickable links in pdf from word
VB.NET Word: How to Process MS Word in VB.NET Library in .NET
Besides, here is the quick link for how to process Word document within We are dedicated to provide powerful & profession imaging controls, PDF document, image
adding hyperlinks to pdf documents; add url pdf
Figure 5: SAS Management Console Parameter Properties and Constraints 
In addition to the WANTREG macro variable, more could be done with input parameters, such as providing lists of 
variables to be analyzed, specifying the type of analysis to be done, and/or specifying presentation options for the 
report. The possibilities are limited only by your imagination (with a few server-specific limitations). 
To finish Step 2, we need to look at the other input parameters—the ODS options that the stored process author has 
determined are necessary. We also need to talk a bit more about the SAS macro facility. All the input parameters to 
stored processes are implemented as global macro variables in the stored process program. 
NAME/VALUE PAIRS AND INPUT PARAMETERS 
What if you're not all that familiar with the SAS macro facility? Here's an analogy to help describe how input 
parameters work. Input parameters are conceptually like the name/value pairs used in Web applications. For 
example, if you went to Google and typed "stored processes" in the Search box, you would get a page of hits. 
Figure 6 shows the first hit at the top of the page. 
Figure 6: Google Search Results with URL Showing Search Program Parameters 
Applications Development
SAS Global Forum 2007
007
VB.NET PDF: Create PDF Document Viewer in C#.NET for Document
reading PDF document in ASP.NET web, .NET Windows Forms and mobile developing applications respectively. For more information on them, just click the link and
pdf link; adding hyperlinks to pdf
VB.NET Word: VB Code to Create Word Mobile Viewer with .NET Doc
For the respective tutorials of these Document or Image Mobile Viewer in VB.NET prorgam, please link to see: PDF Document Mobile Viewer within VB.NET
add url to pdf; accessible links in pdf
If you look in the browser bar (instead of at the hits), you will see the following URL (Figure 7), which executed when 
you clicked the Search button: 
Figure 7: Expanded View of Google Search URL 
In the above example, HL and Q are the names of parameters used by the Google SEARCH program. The 
programmer who wrote the Google SEARCH program had to know that HL and Q were possible parameters that 
would come from the HTML form interface (the page where you clicked the Search button was a form).  
The stored process author has to know what parameters will come from the SAS Intelligence Platform client 
interface. In a stored process program the name of the parameter is a SAS macro variable name, and the value of 
the parameter is a SAS macro variable value. The input parameters that you use in your stored process must follow 
the same rules as for SAS macro variables: 
1.  Macro variables can be accessed through normal macro syntax (&macvar) or through functions like 
SYMGET, SYMGETC, or SYMGETN. Macro variables can be assigned values using CALL SYMPUT or %LET or 
through PROC SQL, in addition to having values collected and set via the client application interface. 
2.  Parameter names can be no longer than 32 characters and must start with an alphabetic character or 
underscore and can contain only alphanumeric characters or underscores. 
For more information about server-specific rules related to input parameters, refer to the "Input Parameters" section 
of the SAS 9.1.3 Integration Technologies Developer's Guide (SAS Institute Inc. 2007(a)).   
In order for the user-supplied input parameters to be used by your stored process, you have to do a little more than 
just reference them in your program and register them in the metadata. Your stored process has to be able to find 
the input parameters in the macro global symbol table. This part of using input parameters is discussed next. 
%STPBEGIN AND %STPEND MACRO PROGRAMS 
The main part of the program conversion takes place when the %STPBEGIN; and %STPEND; macro invocation 
statements replace the ODS invocation statements. In addition, although it is not required, the use of the 
*ProcessBody; comment is recommended for maximum flexibility. On the workspace server, macro variables are 
not initialized until the *ProcessBody comment is encountered. The macro variables used by 
%STPBEGIN/%STPEND are already in the macro global symbol table. The user-defined input parameters also need to 
be in the global symbol table. You will want to use a %GLOBAL statement to place any user-defined input parameters 
in the right place. 
The %STPBEGIN and %STPEND macro program calls replace the ODS HTML "sandwich"; they are a matched set and, 
in concept, perform the same functions as ODS HTML OPEN and CLOSE statements. The %STPBEGIN macro 
initializes the Output Delivery System to generate output from the stored process. The %STPEND macro ends ODS 
processing and delivers the results to the client application that executed the stored process. These macro programs 
use many reserved macro variables to control how they operate. Some of these macro variables are available for 
you to test or even change. Generally, each of the client applications in the SAS Intelligence Platform has a 
preferred ODS destination or result type. HTML is not the default result type for all of the SAS Intelligence Platform 
applications, but, conceptually, the %STPBEGIN; call sets up the ODS environment for a client application in much 
the same way that an ODS HTML OPEN statement sets up the ODS environment to create an HTML file. 
There is an alternate, more advanced, invocation method for stored processes that is generally used with Web-
based client applications. This method is very similar to the kind of invocation (using FILE=_WEBOUT) that was used 
with SAS/IntrNet
®
Application Dispatcher programs. A discussion of this advanced technique is outside the scope of 
this paper. However, these conversion issues are discussed in the SAS Global Forum 2007 paper "Converting 
SAS/IntrNet Programs to SAS Stored Processes" (Weinstein 2007). 
OVERRIDING RESERVED MACRO VARIABLES USED FOR ODS OPTIONS 
When your stored process is executed by one of the client applications, %STPBEGIN initializes the macro parameters 
that are appropriate for the invoking client application. For example, the default result type or ODS destination for 
SAS Enterprise Guide is HTML format, while the default result type for SAS
®
Web Report Studio is the SAS Report 
Applications Development
SAS Global Forum 2007
007
(XML) format. The reserved macro variable, _ODSDEST, holds the name of the destination being used. Normally, you 
do not need to change the _ODSDEST parameter if you want your stored process to generate the result type that is 
the default for the client application or if you want your end-users to be able to select a result type using client 
application selection methods. Consider a stored process written based on DEMO1_TABLE.SAS. The only changes 
needed for the program are those shown below. You can download the full text of the modified code in the 
DEMO2_HTML.SAS program from the Web site listed in the "Resources" section at the end of the paper. 
Original Code 
Modified Code 
From DEMO1_TABLE.SAS 
Saved as DEMO2_HTML.SAS 
ods html file='c:\temp\demo1.html' 
style=sasweb rs=none; 
. . . SAS code . . . 
ods _all_ close; 
%global wantreg _odsoptions _odsstyle 
_odsstylesheet; 
*ProcessBody; 
%let _odsoptions = rs=none; 
%let _odsstyle = sasweb; 
%let _odsstylesheet=; 
%stpbegin;  
. . . SAS Code . . . 
%stpend; 
The %GLOBAL statement ensures that all input parameters are declared, creating an empty macro variable for each 
possible input parameter. This enables you to reference the macro variable in your stored process program, even if it 
was not set by the stored process client application. If an input parameter value is not supplied by a client 
application, declaring it in a %GLOBAL statement prevents unwanted WARNING messages and possible program 
errors from occurring. This is why the WANTREG macro variable appears in the %GLOBAL statement. The other macro 
variables, _ODSOPTIONS, _ODSSTYLE, and _ODSSTYLESHEET don't technically
need to be in the %GLOBAL 
statement, since they are already set to global at the client interface side. I prefer to be explicit about their use so 
that stored process maintenance is easier and subsequent programmers know that I intended to override these 
reserved macro parameters in my code. 
The other macro variables that appear in the %GLOBAL statement are macro variables that are reserved for use with 
the %STPBEGIN macro. A list of all the reserved macro variables used in the demonstration programs can be found 
in the Appendix. The most commonly used reserved macro variables are shown in Table 1. 
ODS Task or Option 
Equivalent Reserved Parameter Name 
ODS Destination 
_ODSDEST 
FILE= 
(or BODY=) 
This ODS option is not used with %STPBEGIN/%STPEND for most clients. Each client 
receives the output from the server that executed the stored process. Within each 
client application there is a way to save the stored process results. There is an 
alternate invocation method for stored processes in which you could specify 
FILE=_WEBOUT; however, this invocation method is typically used only for Web-
based client applications (an advanced topic). 
STYLE= 
_ODSSTYLE sets the STYLE= option to an ODS style. The style name that you use 
must be valid on the server running the stored process. Server sessions may not 
persist from execution of one stored process to another, so if you create a style 
template in one stored process with PROC TEMPLATE code, it may not be available 
to a second stored process running on a different server session unless you write 
the template to a permanently allocated template store on the appropriate server. 
STYLESHEET=(URL=) 
_ODSSTYLESHEET sets the Cascading Style Sheet (CSS) to be used in the creation 
of output (generally, HTML-based output – may not be used by all client 
applications). In most of our examples, we are turning OFF the use of Cascading 
Style Sheets (CSS) by issuing a NULL %LET statement. 
Other options 
_ODSOPTIONS 
A complete list of the reserved variables can be found in the "Reserved Macro Variables" section of the SAS
9.1.3 
Integration Technologies Developer's Guide (SAS Institute Inc. 2007(b)). 
Table 1: ODS Options and Equivalent Parameter Names 
Applications Development
SAS Global Forum 2007
007
If you want to alter any of the reserved macro variables (such as _ODSSTYLE or _ODSOPTIONS) your modifying code 
needs to appear before
the %STPBEGIN; macro program invocation. A stored process can modify the macro 
variables used by the %STPBEGIN macro program at any time before %STPBEGIN; appears in the stored process 
code because this is the point at which the %STPBEGIN macro is called. Changing these reserved macro variables 
after %STPBEGIN has been invoked is not recommended. 
The one ODS option from the original program that has not been converted is the FILE= option. The original 
program created a file called DEMO1.HTML. The SAS Intelligence Platform application dynamically requests and 
dynamically receives the stored process results in the open SAS Enterprise Guide project, Word document, 
PowerPoint presentation, Excel workbook, or SAS Web Report Studio report. The person who invokes the stored 
process has the ability to save the stored process results using the File pull-down menu of the client applications, so 
the FILE= (or BODY=) option is not needed for this stored process. 
Note how the %LET statements for _ODSSTYLE and _ODSOPTIONS precede the %STPBEGIN macro invocation 
statement in the modified program. _ODSSTYLE is overriding a single ODS option, whose usage is predefined in the 
%STPBEGIN macro program. There is no pre-defined reserved macro variable for the RS= option; therefore, the %LET 
statement for _ODSOPTIONS must contain the full specification, RS=NONE. 
After the program is converted, it must be registered in the metadata (this is Step 3). Using SAS Management 
Console, the metadata for the stored process was registered with only the WANTREG parameter and the following 
general properties and execution environment settings: 
Name: demo2_html 
Server: SAS Main – Logical Stored Process Server 
Source Code Repository: S:\Workshop\winsas\sbisp 
Source File: demo2_html.sas 
Output Type: Streaming 
The names of the servers, such as SASMain, are set by your system administrators. For simple tabular output that 
returns results to the client application, the Stored Process Server and Streaming are good choices for Server and 
Output Type, respectively. To reduce confusion, the stored process name is the same as the SAS program name, 
although in a true production environment, you could just as easily have called this stored process something like 
"Performance Report". 
When the DEMO2_HTML stored process is executed for a SAS Enterprise Guide project and the end-user selected 
Canada
for the WANTREG parameter, the partial output would be as shown in Figure 8. 
Figure 8: Executing the Stored Process within a SAS Enterprise Guide Project 
Applications Development
SAS Global Forum 2007
007
When the stored process consumer selects Run
Æ
demo2_html
, the consumer next sees the parameter property 
sheet for the WANTREG parameter as shown in Figure 9. 
Figure 9: SAS Enterprise Guide Interface (with value choices shown) 
If the stored process consumer selects Canada
(which is highlighted because it is the default value), and then 
selects Run
, the output is as shown in Figure 10. 
Figure 10: Partial Output from DEMO2_HTML Stored Process 
Applications Development
SAS Global Forum 2007
007
10 
The program code for the RTF destination is modified in a similar manner, as shown below.  
Original ODS RTF Statements 
Modified Code 
From DEMO1_TABLE.SAS 
Saved as DEMO3_RTF.SAS 
ods rtf file='c:\temp\demo1.rtf' 
bodytitle 
startpage=no keepn notoc_data; 
. . . SAS code . . . 
ods _all_ close; 
%global wantreg _odsoptions _odsdest 
_odsstyle _odsstylesheet; 
*ProcessBody; 
%let _odsdest=rtf; 
%let _odsstyle=rtf; 
%let _odsstylesheet=; 
%let _odsoptions = bodytitle startpage=no 
keepn notoc_data; 
%stpbegin; 
. . . SAS Code . . . 
%stpend; 
The stored process that returns RTF output can be submitted from SAS Enterprise Guide or from the SAS Add-In for 
Microsoft Office, specifically from Microsoft Word. The output when viewed in Microsoft Word is shown in Figure 11.  
Figure 11: Partial Output from DEMO3_RTF Stored Process 
This stored process could also be submitted from the SAS
®
Information Delivery Portal or from a custom Web 
application. It could also be executed via URL using the SAS Stored Process Web Application. The stored process 
that returns RTF would not work, for example, if submitted from Microsoft Excel or SAS Web Report Studio. The 
result type that you choose for _ODSDEST must be appropriate for the client application from which the stored 
process will be executed. 
The PDF version of the stored process presents some different issues. If the stored process returns PDF results, it 
can be executed only from SAS Enterprise Guide or via the advanced Web-based methods. It is not appropriate to 
try to return PDF results to the SAS Add-In for Microsoft Office, or for SAS Web Report Studio. To understand this 
behavior, try to open a PDF file with Microsoft Word, Microsoft Excel, or Microsoft PowerPoint. If you try to open a 
PDF file with Microsoft Word, for example, you are prompted about how the file should be converted (Figure 12). 
Applications Development
SAS Global Forum 2007
007
Documents you may be interested
Documents you may be interested