2009-04-10 46 views
0

这是针对MS SQL 2005的:任何人都知道为什么第一个成功,然后连续创建两个相同的语句失败?所有的陈述都完全一样。将双引号更改为两个单引号具有相同的效果。sp_MSforeachdb MS SQL错误

sp _ MSforeachdb @ command1 ='if(left(“?”,2)=“p _”)begin;打印“?”;结束;';

产生

p _ NationalBrands
p _ NonBrand
p _数据库_名称__开始_随着_ P _下划线

sp _ MSforeachdb @ command1 ='if(left(“?”,2)=“p _”)begin;打印“?”;结束;';
sp _ MSforeachdb @ command1 ='if(left(“?”,2)=“p _”)begin;打印“?”;结束;';

产生

消息102,级别15,状态1,行2 附近有语法错误sp_MSforeachdb'。

回答

1

多个存储过程调用每一个都需要EXEC(UTE)

EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 
EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 

我总是用2个单引号不是双引号,以避免与QUOTED_IDENTIFERS环境设置的问题。

+0

实际上,只有在第一个调用之后才需要exec。 (就个人而言,我会把它作为一个风格问题,但它不是必需的) – cmsjr 2009-04-13 02:45:09

1

你需要明确使用Exec时您呼叫以这种方式多特效,尝试

sp_MSforeachdb @command1 = 'if (left("?", 2) = "p_") begin; print "?"; end;'; 
exec sp_MSforeachdb @command1 ='if(left("?", 2) = "p_") begin; print "?"; end;'; 

从文档Execute

使用存储过程

EXECUTE当您执行存储的时,您不必指定EXECUTE 关键字程序当语句是 第一个批处理。在同一批次