2013-05-05 51 views
0

在我编写的iPhone应用程序中,我连接到用于执行SQL Server存储过程的Web服务。我发送了一些简单的查询,它工作正常。将存储过程转换为NSString的问题

我尝试了一些简单的存储过程,是的,它再次运行良好。问题在于这个特定的存储过程转换为NSString。我意识到我缺少为某些特定字符添加转义字符。我为方括号'[]'和'%'添加了转义字符。我说转义字符是问题,因为执行后得到的错误是说'存储过程中的语法错误'。

但是,当我直接在数据库中执行此操作(即通过SQL命令行客户端本地执行)时,我没有收到任何错误......它工作正常。所以,将它转换为NSString似乎是个问题。请帮忙。

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info); 
SELECT TOP(10) SQLProcessUtilization AS \\[SQL Server Process CPU Utilization\\], 
       SystemIdle AS \\[System Idle Process\\], 
       100 - SystemIdle - SQLProcessUtilization AS \\[Other Process CPU Utilization\\], 
       DATEADD(ms, -1 * (@ts_now - \\[timestamp\\]), GETDATE()) AS \\[Event Time\\] 
FROM ( 
     SELECT record.value('(./Record/@id)\\[1\\]', 'int') AS record_id, 
      record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)\\[1\\]', 'int') 
      AS \\[SystemIdle\\], 
      record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)\\[1\\]', 
      'int') 
      AS \\[SQLProcessUtilization\\], \\[timestamp\\] 
     FROM (
      SELECT \\[timestamp\\], convert(xml, record) AS \\[record\\] 
      FROM sys.dm_os_ring_buffers 
      WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
      AND record LIKE '%%<SystemHealth>%%') AS x 
    ) AS y 
ORDER BY record_id DESC; 

我得到一个错误提示语法错误。我看了这个存储过程成的NSString对象,然后发送的NSString Web服务这样的:

NSError *error; 
NSString *txtFilePath = [[NSBundle mainBundle] pathForResource:@"Proc_Usage" ofType:@"txt"]; 
NSString *procUsage = [NSString stringWithContentsOfFile:txtFilePath encoding:NSUTF8StringEncoding error:&error]; 
if (procUsage == nil) { 
    return -1; 
} 
[[DbConnect DbConnect_Singleton] executeInDb:procUsage]; 
+0

你不检查你收到你的服务器上的,你执行有什么?原来的SQL和你在服务器上使用的东西之间的区别应该相当简单。 – 2013-05-05 12:49:01

+0

我确实试着去看。但SQL Server日志(在Management Studio中)只列出本地执行的查询(尝试在系统表中搜索也是徒劳)。 – Jean 2013-05-05 15:53:34

回答

1

你已经尝试过了,没有任何逃跑呢?我不明白为什么它应该需要任何转义,因为你正在从文件中读取字符串 - 它不像它是一个字符串文字。

+0

真的,詹姆斯。事实上,最初我没有任何逃避的尝试。但是,这给了语法错误(尽管当我在数据库本地执行完全相同的脚本时,它工作正常。另外,执行其他存储过程可以很好地以编程方式工作)。那时我认为可能是与引入一些转义字符有关。你说它是按原样处理,而不是字符串文字? – Jean 2013-05-05 15:55:31

+0

是的,我几乎可以肯定它应该按原样处理。但是,我刚刚注意到的一件事可能是一个问题,那就是在一个查询中有两个命令。您可能想要尝试分割它们,或嵌入ts_now查询内联而不是单独的变量声明。 – 2013-05-05 16:03:13

+0

谢谢@James Holderness;让我试着回去。 – Jean 2013-05-05 16:20:57

0

有可能双百分比读数为单个百分比。你可以尝试改变:

LIKE '%%<SystemHealth>%%' 

LIKE '%%%%<SystemHealth>%%%%' 
+0

谢谢@danh。实际上只有一个%。我已经把double%作为一个转义字符。我实际想要的只是单一的% – Jean 2013-05-05 17:00:48