Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 修剪大表sql serever中的空白_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 修剪大表sql serever中的空白

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 + ',[', '[') +

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

虽然您已经定义了@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;