【问题标题】:Issue in converting a stored procedure to NSString将存储过程转换为 NSString 的问题
【发布时间】:2013-05-05 12:25:27
【问题描述】:

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

我尝试了一些简单的存储过程,是的,它再次运行良好。问题在于这个特定的存储过程转换为 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];

【问题讨论】:

  • 您没有检查您在服务器上收到的内容以及在那里执行的内容吗?原来的 SQL 和你在服务器上使用的 SQL 之间的区别应该是相当简单的。
  • 我确实试图看到这一点。但是 SQL Server 日志(在 Management Studio 中)仅列出本地执行的查询(也尝试在系统表中搜索,但徒劳无功)。

标签: iphone ios objective-c sql-server


【解决方案1】:

你试过没有任何转义吗?我不明白为什么它需要任何转义,因为您正在从文件中读取字符串 - 它不像是字符串文字。

【讨论】:

  • 真的,詹姆斯。事实上,最初我确实尝试过,没有任何转义。但这给出了语法错误(尽管当我在数据库中本地执行完全相同的脚本时,它工作正常。此外,执行少数其他存储过程以编程方式工作正常)。那时我认为这可能与引入一些转义字符有关。你说它是按原样处理的,而不是字符串文字?
  • 是的,我几乎可以肯定它应该按原样处理。不过,我刚刚注意到的一件事可能是一个问题,那就是您在一个查询中有两个命令。您可能想尝试拆分它们,或者将 ts_now 查询嵌入内联而不是作为单独的变量声明。
  • 感谢@James Holderness;让我试着回去。
【解决方案2】:

双百分号可能被解读为单百分号。你可以尝试改变吗:

LIKE '%%<SystemHealth>%%'

LIKE '%%%%<SystemHealth>%%%%'

【讨论】:

  • 感谢@danh。它实际上只有一个 %。我把 double % 作为转义字符。我实际上想要的只是一个 %
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多