2016-09-19 44 views
-1

我想将下面的查询作为动态SQL。如何使表格截断查询为动态SQL

查询1:表截断

select 'Truncate Table '+''+ name from sys.tables where name like '%RND%' 

问题2:

select 'Insert into '+''+ name +'Select * from '+'.'+''+ name from sys.tables where name like '%RND%' 

回答

0

通过使用以下动态查询可以截断所需的表:

DECLARE @DynamicSQL AS VARCHAR(MAX) = ''; 

SELECT @DynamicSQL = @DynamicSQL + 'TRUNCATE TABLE ' + QUOTENAME(NAME) + '; ' 
FROM sys.tables 
WHERE NAME LIKE '%RND%'; 

--PRINT @DynamicSQL 
EXEC (@DynamicSQL) 

对于第二查询动态查询是:

DECLARE @DynamicSQL1 AS VARCHAR(MAX) = ''; 

SELECT @DynamicSQL1 = @DynamicSQL1 + 'INSERT INTO ' + QUOTENAME(NAME) + ' SELECT * FROM ' + QUOTENAME(NAME) + '; ' 
FROM sys.tables 
WHERE NAME LIKE '%RND%'; 

--PRINT @DynamicSQL1 
EXEC (@DynamicSQL1) 
+0

谢谢阿鲁。如果可能,请您提供查询2 – SNR

+0

@SNR:查询已更新为第二个选项 – Arulkumar

+0

Great Arul。您的帮助是非常感谢,不幸的是它显示消息窗口,因为我不符合投票的这个答案.. – SNR

0

这可能是你在找什么

所有语句被收集在一个表中,通过它们的插入点排序(idIDENTITY)。这将是 - 肯定 - 没问题为您打造以同样的方式你的第二个说法......

DECLARE @cmdTbl TABLE(id INT IDENTITY,cmd NVARCHAR(MAX)); 

INSERT INTO @cmdTbl(cmd) 
SELECT 'TRUNCATE TABLE ' + QUOTENAME(t.TABLE_CATALOG) + '.' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME) + ';' 
FROM INFORMATION_SCHEMA.TABLES AS t 
WHERE t.TABLE_NAME LIKE '%RND%' 

--AFTER收集我用CURSOR执行它们一个接一个的所有语句。

DECLARE @cmd VARCHAR(MAX); 
DECLARE cur CURSOR FOR SELECT cmd FROM @cmdTbl ORDER BY id; 
OPEN cur; 

FETCH NEXT FROM cur INTO @cmd; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @cmd; 
    --EXEC(@cmd); --For syntax check you start without EXEC... 
    FETCH NEXT FROM cur INTO @cmd; 
END 
CLOSE cur; 
DEALLOCATE cur;