2015-06-09 23 views
0

我试图用下面的代码来生成超过90桌更新语句:SQL SERVER 2000截断生成的SQL字符串中使用动态SQL

Declare @cmd VARCHAR(8000) 

     Select @cmd = COALESCE(@cmd,'') + 
     ' 
     UPDATE ' + TABLE_NAME + ' SET ' + Column_Name + ' = ''000000000''' + ''' 
     WHERE ' + Column_Name + ' = ''000000001''' + ''' 
     ' 


     From INFORMATION_SCHEMA.COLUMNS 
        Where TABLE_NAME not in (SELECT TABLE_NAME 
         From INFORMATION_SCHEMA.VIEWS) 
        and 
         (Column_Name like 'SSN%'  
         OR Column_Name LIKE 'ssn%'   
         OR Column_Name LIKE 'ssn%'   
         OR Column_Name LIKE '%_ssn%'    
         OR Column_Name LIKE '_ocsecno'   
         OR Column_Name LIKE 'Ssn%'); 

      Select @cmd 

代码的作品,但SQL Server 2000是能够产生更新语句91个表格中只有45个表格。它会截断第45个表中的SQL字符串。有没有人知道如何解决这个问题?

+1

查询字符串得到多大?如果它超过8000个字符,那么是的,你会得到一个截断的查询。 –

+0

其超过8000个字符 – zilla

+0

所以......“我有10加仑的水和1加仑的杯子,为什么当我倒入所有的水时杯子溢出? –

回答

1

如果您只是想生成更新语句,您可以将更新插入临时表中。

SELECT 
    ' 
     UPDATE ' + TABLE_NAME + ' SET ' + Column_Name + ' = ''000000000''' + ''' 
     WHERE ' + Column_Name + ' = ''000000001''' + ''' 
    ' AS [query] 
INTO 
    #tempCmd 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME NOT IN (SELECT 
        TABLE_NAME 
        FROM 
        INFORMATION_SCHEMA.VIEWS) 
    AND (Column_Name LIKE 'SSN%' 
     OR Column_Name LIKE 'ssn%' 
     OR Column_Name LIKE 'ssn%' 
     OR Column_Name LIKE '%_ssn%' 
     OR Column_Name LIKE '_ocsecno' 
     OR Column_Name LIKE 'Ssn%'); 

SELECT [query] FROM #tempCmd 
+0

好点。但是,我想将所有更新语句作为一个事务执行。全部或没有处理。有关如何做到这一点的任何建议? – zilla

+0

你是否试图在存储过程中做到这一点?您可以创建一个游标来遍历临时表并执行每一行,或者跳过临时表并为查询创建一个游标以选择表名称和列 – JamieD77