Using the new adjustbox package of Martin Scharrer, you can place your tabular inside of an adjustbox. This package will shrink your tabular to fit to the \textwidth (and to the \textheight, if that should be necessary) without distortion of the text (or any other content in the box; keepaspectratio is the key).
\begin{adjustbox}{width={\textwidth},totalheight={\textheight},keepaspectratio}%
\begin{tabular}{p{2cm}|p{4cm}|p{3cm}|p{3cm}}
...
\end{tabular}%
\end{adjustbox}
But because it resizes the tabular, it is better suited for cases like
\begin{tabular}{c|c|c|c}
For columns with fixed width Herbert's solution is more appropriate, which removes horizontal space at the beginning and end of a row.