数据类型为nvarchar和varchar是在模运算符不兼容(The data types nvar

2019-10-20 09:58发布

我使用下面的命令光标更新基于连接上我的表中的记录。

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

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

消息402,级别16,状态1,行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。 我已经测试中间的更新部分,并且运行正常自身。

任何帮助极大的赞赏。

Answer 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条件实际上并没有太大的意义在这里。



文章来源: The data types nvarchar and varchar are incompatible in the modulo operator