0

我有一个关于 T-SQL 动态 SP 的问题。第一个块是我的失败尝试,第二个是我的目标(非动态块)。

CREATE PROCEDURE UDP1_TRY_EQQQ
(@FACTUTABLE nvarchar(100))
AS 
declare @sqlquery as nvarchar(100)
BEGIN
SET @sqlquery = 'DELETE FROM ' + @FACTUTABLE + ' WHERE ANEXO IN 
    (SELECT ANEXO FROM ' + @FACTUTABLE + ' A LEFT JOIN ALTAS_MOVILES B 
    ON A.ANEXO=B.TCNFOL WHERE B.TCNFOL IS NULL)'
EXEC sp_ExecuteSql @sqlquery
END


DELETE FROM FACTURACION_201210
WHERE ANEXO IN 
(
SELECT ANEXO
FROM FACTURACION_201210 A
LEFT JOIN ALTAS_MOVILES B
ON A.ANEXO=B.TCNFOL
WHERE B.TCNFOL IS NULL
)
4

1 回答 1

1

您的 @sqlquery 变量只允许 100 个字符。让它更大。

此外,在您需要替换表名的这些动态查询中,我喜欢采取两个额外的预防措施:

  1. 使用QUOTENAME()。例如:@sql = 'Select * FROM ' + QuoteName(@table);
  2. 在 information_schema 中查找表名,以确保它不会导致语法错误:SELECT Table_Name FROM Information_schema.Tables WHERE Table_Name = @FACTUTABLE;

如果您想真正花哨,您还可以检查表是否在正确的模式中,甚至检查 information_schema.columns 以确保所选表具有正确的列名,但通常只有前两个检查我去。

于 2012-11-27T22:51:51.983 回答