Sql server 修剪大表sql serever中的空白
如何动态修剪超过300列的大型表。当我尝试使用这段代码时,我得到了一个错误,因为变量@sql是nvarchar(max)的,我有300个列,所以当我运行这个查询时,所有的列名都没有出现。有人能帮我吗Sql server 修剪大表sql serever中的空白,sql-server,sql-server-2008,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 + ',[', '[') +
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
虽然您已经定义了@sqlnvarchar(max),但这一切都归结为如何将查询发送到sqlserver引擎 引用最大容量规格 Network Packet Size是用于在应用程序和关系数据库引擎之间通信的表格数据流(TDS)数据包的大小。默认数据包大小为4 KB,由Network Packet Size配置选项控制 提交到引擎的查询的最大批大小为64*4或250 MB。这比(最大)=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)
使用varchar()而不是nvarchar返回2的幂
我希望这能解决您的问题。应该是
EXECUTE(@SQL)
而不是EXECUTE@SQL
。也可以使用QUOTENAME
而不是自己添加方括号,而且这种字符串连接的方法不能保证。所有列都是某种字符串数据类型吗?如果没有,您应该过滤信息\u架构.列.数据\u类型
。您总是可以进行多次传递,例如,一次处理100列。当我添加去毛刺线时,它给了我TSQL 8595的LEN一样的效果。您可以发布实际TSQL语句的片段吗?另外,我想知道带不同变量的+运算符(nvarchar(128),静态文本)是否在执行隐式转换我必须运行,但稍后将查看它…当我在没有执行(@SQL)的情况下运行上述动态查询时。它给了我一个update语句作为我的输出。其中语句在中间停止,完成所有列。有什么办法吗?您是否尝试将update语句的所有部分强制转换为varchar(max)?请向我发送创建表代码-右键单击SSMS并生成T-SQL。我正在笔记本电脑上使用2012,无法导致错误。
SET @SQL = cast('UPDATE [' as varchar(max)) + cast(@TableName as varchar(max)) + cast('] SET ' as varchar(max)) + @SQL;