0

如何动态修剪超过 300 列的大表。当我尝试使用此代码时出现错误,因为变量@sql 是 nvarchar(max) 并且我有 300 列,所以当我运行此查询时所有列名都没有出现,任何人都可以帮助我吗?

    DECLARE @SQL nVARCHAR(MAX)
    DECLARE @TableName NVARCHAR(128)
    SET @TableName = 'MYTAbleName'

    SELECT @SQL = COALESCE(@SQL + ',[', '[') + 
    COLUMN_NAME + ']=LTRIM(RTRIM([' + COLUMN_NAME + ']))'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @TableName

      SET @SQL = 'UPDATE [' + @TableName + '] SET ' + @SQL
      PRINT @SQL
      EXECUTE @SQL
4

1 回答 1

0

虽然您已经定义了@SQL nvarchar(max),但这一切都归结为如何将查询发送到 SQL 服务器引擎。

引用自MSDN最大容量规范。

“网络数据包大小是用于在应用程序和关系数据库引擎之间进行通信的表格数据流 (TDS) 数据包的大小。默认数据包大小为 4 KB,由网络数据包大小配置选项控制。”

对于要提交给引擎的查询,最大批量大小为 64 * 4 或 250 MB。这比 (max) = 2GB 小很多。

添加调试行以查看您是否接近此限制。注释掉打印 t-sql 并执行查询。

-- Show how long the dynamic t-sql is
-- PRINT @SQL
PRINT 'LEN OF TSQL'
PRINT LEN(@SQL)
-- EXECUTE @SQL

如果是这个问题,请反馈!

我没有像你这样的测试用例。

-- Use msdb
USE MSDB
GO

-- Largest column count = 62, [sysutility_ucp_instances]
SELECT TABLE_NAME, MAX(ORDINAL_POSITION) as MaxCols
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY TABLE_NAME 
order by MAX(ORDINAL_POSITION) desc

由于您的 TSQL 被切断,它必须转换为最大 8000 字节的 varchar()。

尝试将更新的每一部分转换为 varchar(max)。

SET @SQL = cast('UPDATE [' as varchar(max)) + cast(@TableName as varchar(max)) + cast('] SET ' as varchar(max)) + @SQL;

使用 varchar() 而不是 nvarchar 来获得 2 的一次幂。

我希望这可以解决您的问题。

于 2013-09-24T17:42:02.943 回答