使用变量或子查询设置varchar列长度

时间:2014-08-11 17:46:20

标签: sql sql-server varchar

我有一个通过导入Excel文件创建的表。在这种情况下,所有文本字段都导入为nvarchar(255)。我宁愿做批量导入然后操纵表格。我知道SSIS允许我通过数据映射设置数据类型和大小,但这对我来说似乎并不一致。也许我没有正确地抓住我的嘴......

无论如何,我想将varchar长度定义更改为每列中数据的最大长度。而不是运行一个语句来检查最大长度作为文字......

select max(len(rtrim(FIELD))) from TABLE$

...我想在代码中执行此操作。所以我想到了这个想法:

declare @Var int
set @Var = (select max(len(rtrim(FIELD))) from TABLE$)
alter table dbo.TABLE$ alter column FIELD varchar(@Var)

第一行和第二行工作正常,但在执行第三行时出现错误:

  

Msg 102,Level 15,State 1,Line 5
  '@Var'附近的语法不正确。

所以我试过这个,认为这将是一个更紧凑的解决方案...

alter table dbo.TABLE$ 
  alter column FIELD varchar(select max(len(rtrim(FIELD))) from TABLE$)

......但事实并非如此。我收到了这些错误:

  

第15行,第1行,第1行,第1行   关键字“select”附近的语法不正确。

     

Msg 102,Level 15,State 1,Line 1
  ')'附近的语法不正确。

所以我的问题是两个人的问题。首先,为什么这些方法不起作用,其次,什么工作 - 没有找到每列的mas长度,然后用文字设置varchar长度?

提前致谢。

1 个答案:

答案 0 :(得分:1)

动态SQL适用于您尝试执行的操作。它是适合工作的正确工具还是正确的工具是另一个故事。试一试:

DECLARE @cmd NVARCHAR(4000)
SET @cmd = 'ALTER TABLE dbo.Table$ ALTER COLUMN FIELD VARCHAR(' + CAST((SELECT MAX(LEN(RTRIM(FIELD))) FROM dbo.TABLE$) AS NVARCHAR(10)) + ')'
EXEC(@cmd)

该查询解析但我没有尝试运行它。但是要小心使用Dynamic SQL。如果你开始在任何地方使用它,它会让你陷入困境。进一步阅读:

http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql

http://www.sommarskog.se/dynamic_sql.html