Q:

Actualizar datos de una tabla en un SP conforme éste busca datos de otras tablas. FOR...LOOP

Tengo un SP que me selecciona desde dos tablas los flujos de una cuenta de cliente en un periodo dado. La tabla de Registro de Movimientos únicamente indica si es compra(cargo) o venta (abono) y el monto de éste; la otra tabla sólo dice cuál era el saldo al momento de abrir la cuenta i.e. Cliente y Saldo Inicial. 
El procedimiento debe mostrar una tabla que resuma todos los movimientos entre dos fechas dadas pero a la vez, cada fila debe indicar en una columna cuál va siendo el saldo conforme van sucediendo los movimientos. ESTE es mi problema, ¿Cómo puedo hacer que por cada registro encontrado me genere ese saldo?
Suponiendo que el saldo inicial es cero, el SP que tengo toma el dato del saldo inicial y suma todos los movimientos hasta la fecha inicial del periodo a seleccionar, digamos que el acumulado hasta esa fecha sea 198, este valor debe sumarse al movimiento que inicia la tabla de resultados, la tabla que quiero se vería así:

Saldo inicial=0 
Periodo De:2017-08-30, A: 2017-09-10 
Saldo a la fecha inicial= $ 198

Fecha      | Operación | Importe | Saldo
2017-08-30 | Compra    | 100     | 98
2017-08-31 | Venta     | 10      | 108
2017-08-31 | Compra    | 100     | 8

Como ven, a veces hay más de un movimiento al día, por lo que necesito que se haga por movimiento (vale mencionar que la tabla de movimientos tiene un Primary Key para cada movimiento, no sé si esto ayude de algo). Este es mi código:
    PROCEDURE [dbo].[Movimientos_entre_fechas] @pmFechaDe date,@pmFechaA date,@pmCuenta nvarchar(20)
AS 
SET NOCOUNT ON

Declare @varSaldo float=0,@pmInicial float=0,@SaldoXmovimiento float

--LEER DEL ESTADO INICIAL
SET @pmInicial=(SELECT Efectivo+Saldo  FROM EstadoInicial WHERE Cuenta=@pmCuenta) --Cash Disponible al Inicio de la cuenta
SET @varSaldo=(SELECT SUM(Importe) FROM Movimientos WHERE Cuenta=@pmCuenta and Fecha<=@pmFechaDe) --SUMA MOVIMIENTOS

SET @SaldoXmovimiento=@pmInicial+@varSaldo

SELECT Fecha,Operacion,Cantidad,Precio,ROUND(Precio*ABS(Cantidad),2) as [Importe Bruto],Comision,Impuesto,Importe as [Cargo/Abono],@SaldoXmovimiento + A.Importe as SALDO, A.Clave FROM Movimientos A 
LEFT JOIN Productos B ON A.EmiID=B.EmiID
WHERE a.Fecha>=@pmFechaDe and a.Fecha<=@pmFechaA and A.Cuenta=@pmCuenta ORDER BY Fecha
SET NOCOUNT Off  --El Join es para identificar qué Producto es

A:

Tu pregunta se reduce a un tema de Suma acumulada, si buscas en la red hay varios trucos para resolverlo. En lo posible evita la tentación de usar cursores y loops, suelen ser muy poco performantes y además implican una carga importante para el motor. En el siguiente ejemplo, conceptualmente lo que hacemos es crear una tabla temporal dónde volcaremos todas las operaciones con el orden adecuado (esto es fundamental) y que además tendrá un Id autonumérico. Luego la idea es hacer un JOIN a la misma tabla pero de los registros menores o iguales al actual de la tabla base, de esta forma sumamos (acumulamos) todos los importes hasta el registro listado. Este es un ejemplo reproducible como para que veas como funciona la idea:
En primer lugar creamos nuestras dos tablas de ejemplo que simularán las tuyas y las llenamos con algunos ejemplos (El Cliente 1 es exactamente tu ejemplo):
CREATE TABLE #SaldosIniciales (
    Cuenta  INT,
    Saldo       NUMERIC(15,2)
)

CREATE TABLE #Movimientos (
    Cuenta      VARCHAR(20),
    Fecha       DATETIME,
    Operacion   VARCHAR(15),
    Importe     NUMERIC(15,2)
)

INSERT INTO #SaldosIniciales (Cuenta, Saldo) VALUES ('1', 198)
INSERT INTO #Movimientos (Cuenta, Fecha, Operacion, Importe) 
    VALUES  ('1', '20170830', 'Compra', 100),
        ('1', '20170831', 'Venta', 10),
        ('1', '20170831', 'Compra', 100),
        ('2', '20170830', 'Compra', 300),
        ('2', '20170830', 'Compra', 100),
        ('2', '20170831', 'Venta', 1000),
        ('2', '20170901', 'Compra', 100)

Ahora creamos nuestra tabla temporal de trabajo, notese el Id autonumérico:
CREATE TABLE #Saldos (
    Id          INT IDENTITY,
    Cuenta      VARCHAR(20),
    Fecha       DATETIME,
    Operacion   VARCHAR(15),
    Importe     NUMERIC(15,2)
)

Ahora llenamos nuestra tabla de trabajo con los datos reales, muy importante el orden ya que determinará el Id que tengan los registros. Hay un CASE en el ORDER simplemente para mantener el mismo orden del ejemplo, dónde la venta aparece antes de la compra en un mismo día, es un detalle que puedes obviar si no te interesa.
INSERT INTO #Saldos (Cuenta, Fecha, Operacion, Importe) 
SELECT  M.Cuenta,
    M.Fecha,
    M.Operacion,
    M.Importe
    FROM #Movimientos M
    ORDER BY M.Cuenta,
        M.Fecha,
        CASE WHEN M.Operacion = 'Venta' THEN 0 ELSE 1 END

Y por último la consulta en sí, a la que le hemos agregado mediante un LEFT JOIN la tabla de saldos iniciales para que participe en la suma.
SELECT  T1.Cuenta,
    T1.Fecha,
    T1.Operacion,
    T1.Importe,
    ISNULL(SI.Saldo,0) + SUM(CASE WHEN T2.Operacion = 'Compra' THEN -1 ELSE 1 END * T2.Importe) AS Saldo
    FROM #Saldos t1
    INNER JOIN #Saldos T2 
        ON  T1.id >= T2.id
        AND T1.Cuenta = T2.Cuenta
    LEFT JOIN #SaldosIniciales SI
        ON SI.Cuenta = T1.Cuenta
    GROUP BY T1.Id, 
        T1.Cuenta,
        T1.Fecha,
        T1.Operacion,
        T1.Importe,
        SI.Saldo
    ORDER BY T1.Id

La salida obtenida:
+--------+--------------------------+-----------+----------+---------+
| Cuenta | Fecha                    | Operacion | Importe  | Saldo   |
+--------+--------------------------+-----------+----------+---------+
| 1      | 30/08/2017 12:00:00 a.m. | Compra    | 100,00   | 98,00   |
+--------+--------------------------+-----------+----------+---------+
| 1      | 31/08/2017 12:00:00 a.m. | Venta     | 10,00    | 108,00  |
+--------+--------------------------+-----------+----------+---------+
| 1      | 31/08/2017 12:00:00 a.m. | Compra    | 100,00   | 8,00    |
+--------+--------------------------+-----------+----------+---------+
| 2      | 30/08/2017 12:00:00 a.m. | Compra    | 300,00   | -300,00 |
+--------+--------------------------+-----------+----------+---------+
| 2      | 30/08/2017 12:00:00 a.m. | Compra    | 100,00   | -400,00 |
+--------+--------------------------+-----------+----------+---------+
| 2      | 31/08/2017 12:00:00 a.m. | Venta     | 1.000,00 | 600,00  |
+--------+--------------------------+-----------+----------+---------+
| 2      | 01/09/2017 12:00:00 a.m. | Compra    | 100,00   | 500,00  |
+--------+--------------------------+-----------+----------+---------+

