我正在尝试根据我的一个名为[Tariff Lookup]的表中的字段编写查找/更新查询。已经根据先前的查询填充了[Tariff Lookup]。 例如:
如果[客户查询] = RFT001,则从关税A中查找
如果[客户查询] = DEF001,则从关税B中查找
使用下面的代码我已经设法通过将我的SQL结果存储为名为@tablevalue的参数然后使用动态SQL来获取动态表名值位。但问题是@tablevalue是一个静态变量,总是返回“Tariff A”,因为它需要逐行工作。
DECLARE @tablevalue nvarchar(max);
DECLARE @sql nvarchar(max);
SELECT @tablevalue = [Tariff Lookup]
FROM [DaisyBilling].[dbo].[APRW14_FFA68878_Calls];
SELECT @sql = N'UPDATE [APRW14_FFA68878_Calls]
SET [APRW14_FFA68878_Calls].[Sell Price] = [test].[dbo].' + @tablevalue +'.[Peak]/60*[APRW14_FFA68878_Calls].[Duration (secs)]
FROM [Test].[dbo]. ' + @tablevalue +'
INNER JOIN [DaisyBilling].[dbo].[APRW14_FFA68878_Calls] on [DaisyBilling].[dbo].[APRW14_FFA68878_Calls].[ChargeCode] = [Test].[dbo]. ' + @tablevalue +'.[Chargecode]';
EXEC sp_executesql @sql
表结构
我需要做的是填充[APRW14_FFA68878_Calls]表中的[Sell Price]值。这是关税表中[峰值]值的计算。例如。[峰值] / 60 * [APRW14_FFA68878_Calls]。[持续时间(秒)]
有人之前曾提到使用SQL游标可能是前进的方法,但我不知道如何格式化Cursor查询。
这也是VB.net项目的一部分,所以我不确定使用VB或SQL是否最好。
任何指示或建议都非常感激。
PS。我对VB / SQL比较陌生,所以如果有人能提供代码示例也会有所帮助。
由于
更新:我现在使用Cursor方法,如下所示,但它循环6376次,每次更新6376条记录。我怎样才能让它更新每一行1次?感谢
答案 0 :(得分:1)
您可以像这样设置光标:
DECLARE @tablevalue NVARCHAR(MAX)
, @sql NVARCHAR(MAX);
DECLARE table_value_cursor CURSOR FOR
SELECT [Tariff Lookup]
FROM [DaisyBilling].[dbo].[APRW14_FFA68878_Calls];
OPEN table_value_cursor
FETCH NEXT FROM table_value_cursor INTO @tablevalue
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = N'UPDATE [APRW14_FFA68878_Calls]
SET [APRW14_FFA68878_Calls].[Sell Price] = [test].[dbo].' + @tablevalue +'.[Peak]/60*[APRW14_FFA68878_Calls].[Duration (secs)]
FROM [Test].[dbo]. ' + @tablevalue +'
INNER JOIN [DaisyBilling].[dbo].[APRW14_FFA68878_Calls] on [DaisyBilling].[dbo].[APRW14_FFA68878_Calls].[ChargeCode] = [Test].[dbo]. ' + @tablevalue +'.[Chargecode]';
EXEC sp_executesql @sql;
FETCH NEXT FROM table_value_cursor INTO @tablevalue;
END
CLOSE table_value_cursor
DEALLOCATE table_value_cursor;
答案 1 :(得分:1)
我不知道你在做什么所有这些变量和动态Sql我会写这个查询只是这样....
UPDATE T
SET T.[Sell Price] = (TL.[Peak] / 60) * T.[Duration]
FROM [DaisyBilling].[dbo].[APRW14_FFA68878_Calls] T
INNER JOIN [test].[dbo].[Tarrif] TL
ON T.[ChargeCode] = TL.[Chargecode]