如何根据表值编写动态SQL查询

时间:2014-05-28 13:39:51

标签: sql sql-server vb.net lookup

我正在尝试根据我的一个名为[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

Tariff Table

我需要做的是填充[APRW14_FFA68878_Calls]表中的[Sell Price]值。这是关税表中[峰值]值的计算。例如。[峰值] / 60 * [APRW14_FFA68878_Calls]。[持续时间(秒)]

有人之前曾提到使用SQL游标可能是前进的方法,但我不知道如何格式化Cursor查询。

这也是VB.net项目的一部分,所以我不确定使用VB或SQL是否最好。

任何指示或建议都非常感激。

PS。我对VB / SQL比较陌生,所以如果有人能提供代码示例也会有所帮助。

由于

更新:我现在使用Cursor方法,如下所示,但它循环6376次,每次更新6376条记录。我怎样才能让它更新每一行1次?感谢

2 个答案:

答案 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]