修剪大型sql server中的空白区域

时间:2013-09-24 17:30:20

标签: sql-server sql-server-2008

如何动态修剪超过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

1 个答案:

答案 0 :(得分: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被截断,它必须转换为varchar(),其最大值为8000字节。

尝试将每个更新版本转换为varchar(max)。

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

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

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