日期:2014-05-17  浏览次数:20462 次

在线等:请问如何在动态sql中判断传入的参数是数据库中指定的表名?
求助:我写了一个共用的存储过程,对传入的表参数进行父子节点的删除操作,但是对某个表还要进行其他关联操作,所以需要在动态sql中把这个表找出来,调试中总是报错把表名当成了列名,请问怎么解决?

BEGIN

    DECLARE @SQL AS nvarchar(max)
    SET @SQL = 
    'WITH RecursiveCte AS
    (
        SELECT 1 as Level, H1.Id, H1.ParentId  FROM ' + @TableName + ' H1
        WHERE id = ' + CAST(@Id as Nvarchar(max)) + '
        UNION ALL
        SELECT RCTE.level + 1 as Level, H2.Id, H2.ParentId FROM ' + @TableName + ' H2
        INNER JOIN RecursiveCte RCTE ON H2.ParentId = RCTE.Id
    )
    SELECT id 
    INTO #tmpTable
    FROM RecursiveCte
   if '+ @TableName +'=object_id(''数据库中指定的表名'',''U'')--这个判断条件该怎么写?
 begin
   ---进行其他操作
 end 
    delete from ' + @TableName + ' where id in( SELECT id 
    FROM  #tmpTable)
   ' 
      EXEC sp_executesql @SQL;
END
sql 动态sql

------解决方案--------------------
那你肯定写错了应该在@tablename两边加上单引号,这样才是字符比较
if '''+ @TableName +'''=''a''
ps:整句两边的单引号省略,直接贴过去覆盖你那一行就行了