如何截断不为空的SQL Server表?

She*_*ouk 0 sql sql-server

DECLARE @sql VARCHAR(MAX)

SELECT @sql = X.[text()]
FROM
    (SELECT 'truncate table '+ t.TABLE_NAME + ';' AS [text()]
     FROM sysindexes i, INFORMATION_SCHEMA.TABLES t
     WHERE t.TABLE_NAME = object_name(i.id)
       AND t.TABLE_TYPE = 'BASE TABLE' 
       AND t.TABLE_NAME NOT IN ('Test')
     GROUP BY t.TABLE_SCHEMA, t.TABLE_NAME
     HAVING MAX(i.rows) > 0
     FOR XML PATH ('')) X

exec(@sql)
Run Code Online (Sandbox Code Playgroud)

我正在尝试在这个问题中创建类似于上述的脚本,但是我得到了:

消息8155,级别16,状态2,行12
没有为“ X”的列1指定列名。

消息207,级别16,状态1,第2行
无效的列名称'text()'

Sea*_*nge 5

这是一个更简单的方法。这仍然是非常脆弱的,并且很有可能闯入……好吧……几乎每个地方的每个数据库,因为如果有表的外键,您就不能截断表。

declare @SQL nvarchar(MAX) = ''

SELECT @SQL = @SQL + 'truncate table '+ t.TABLE_NAME + ';' 
FROM sysindexes i
join INFORMATION_SCHEMA.TABLES t on t.TABLE_NAME = object_name(i.id)
WHERE t.TABLE_TYPE = 'BASE TABLE' 
    AND t.TABLE_NAME NOT IN ('Test')
GROUP BY t.TABLE_SCHEMA
    , t.TABLE_NAME
HAVING MAX(i.rows) > 0

select @SQL
--exec sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)