数据类型nvarchar和varchar在模运算符中不兼容

时间:2014-07-06 14:32:12

标签: sql sql-server cursor

我正在使用以下cursor命令根据连接更新我的表上的记录。

我有一些类似的代码在我的程序的另一部分正常工作,但没有在连接上使用LIKE逻辑。

但是当我执行此代码时,它会抛出一个错误。

  

Msg 402,Level 16,State 1,Line 12
  数据类型nvarchar和varchar在模运算符中不兼容。

这是我的代码:

DECLARE @tablevalue NVARCHAR(MAX), @sql NVARCHAR(MAX); 

DECLARE table_value_cursor CURSOR 
FOR
    SELECT DISTINCT [Tariff Lookup]
    FROM [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325];

OPEN table_value_cursor 

FETCH NEXT FROM table_value_cursor INTO @tablevalue 

WHILE @@FETCH_STATUS = 0 
BEGIN
   SELECT @sql = N'

   UPDATE [masked_2014-06-30-2014-06-01-customer325] 
   SET [masked_2014-06-30-2014-06-01-customer325].[Sell Price] = 
ROUND ([Orbisrates].[dbo].[Orbis_Import_June2014].[Peakperminute] / 60 * [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ChargedTimeSecs] + [Orbisrates].[dbo].[Orbis_Import_June2014].[Peakconnect], 4) 
   FROM [OrbisRates].[dbo].[Orbis_Import_June2014]
   INNER JOIN [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] on [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[To] LIKE [Orbis_Import_June2014].[Destination]+'%'
   WHERE 
      [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[tariff lookup] = '''+ @tablevalue +'''';

   EXEC sp_executesql @sql; 

   FETCH NEXT FROM table_value_cursor INTO @tablevalue; 
END 

CLOSE table_value_cursor 
DEALLOCATE table_value_cursor;

PS。我已经在中间测试了更新部分,并且可以自行运行。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于错误使用LIKE运算符而导致该错误,如下面的代码

中所述
INNER JOIN [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] 
on  LIKE [Orbis_Import_June2014].[Destination]+'%' <-- Here

把它放在引号内。你应该做类似下面的事情(示例)

select * from table1
where order_id like '%''' + order_no + '%'''

所以在你的情况下你应该改变它如下

   SELECT @sql = N'
   <....Rest Of Code ...> 
   on [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[To] 
   LIKE' + '%''' + '[Orbis_Import_June2014].[Destination]' + '%''' +
   ' WHERE [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] ...'

修改

您不需要光标来完成您想要做的事情。你基本上做的是 对于表[Tariff Lookup]下的[masked_2014-06-30-2014-06-01-customer325]的每个值,您都是。{ 试图做UPDATE。只需一个查询就可以实现同样的目的;通过制作 选择[Tariff Lookup]子查询,如下所示。试一试,看看它是怎么回事。

UPDATE masked325 
SET masked325.[Sell Price] = ROUND (orbit14.[Peakperminute] / 60 * masked325.
[ChargedTimeSecs] + orbit14.[Peakconnect], 4) 
FROM [OrbisRates].[dbo].[Orbis_Import_June2014] orbit14
INNER JOIN [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] masked325
on orbit14.[Destination] = masked325.[To]

WHERE masked325.[tariff lookup] 
IN (
    SELECT DISTINCT [Tariff Lookup]
    FROM [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325]
  );

旁注:WHERE条件在这里实际上没有多大意义。