D (322 chars)
For each unsolved square it builds an array of available options and then loops over it.
import std.algorithm,std.range,std.stdio;void main(char[][]args){T s(T)(T p){foreach(i,ref c;p)if(c<49){foreach(o;"123456789".setDifference(chain(p[i/9*9..i/9*9+9],p[i%9..$].stride(9),p[i/27*27+i%9/3*3..$][0..21].chunks(3).stride(3).joiner).array.sort)){c=o&63;if(s(p))return p;}c=48;return[];}return p;}s(args[1]).write;}
with whitespace:
import std.algorithm, std.range, std.stdio;
void main(char[][] args) {
T s(T)(T p) {
foreach (i, ref c; p) if (c < 49) {
foreach (o; "123456789".setDifference(chain(
p[i/9*9..i/9*9+9],
p[i%9..$].stride(9),
p[i/27*27+i%9/3*3..$][0..21].chunks(3).stride(3).joiner
).array.sort))
{
c = o&63;
if (s(p)) return p;
}
c=48;
return [];
}
return p;
}
s(args[1]).write;
}