我正在使用以下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。我已经在中间测试了更新部分,并且可以自行运行。
非常感谢任何帮助。
答案 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
条件在这里实际上没有多大意义。