如何在不重新输入字段名称的情况下比较修剪和未修剪的字段长度?

时间:2011-05-11 17:42:46

标签: sql database sql-server-2005

基本上,我想检查varchar字段中文本右侧是否有空格。为此,我想将DATALENGTH(fieldName)DATALENGTH(RTRIM(fieldName))进行比较。

这不是那么难。

唯一的问题是,我需要为五个表中的所有varchar字段执行此操作。它需要以这种方式比较大约250个字段。有没有办法我可以将所有这些字段名称放入一个查询而不键入每个人的名字2x?

我正在使用此查询来获取我需要查看的字段的名称。

SELECT name FROM sys.columns WHERE object_id = 
    (SELECT object_id FROM sys.tables WHERE name='tableName') 
AND system_type_id = 167

(使用SQL Server 2005)

谢谢!

4 个答案:

答案 0 :(得分:2)

如果只是键入问题,我会让SQL Server为我生成代码:

SELECT
    'SELECT * FROM ' + o.name + ' WHERE DATALENGTH(' + c.name + ') > DATALENGTH(RTRIM(' + c.name + '))'
FROM
    sys.objects o
INNER JOIN sys.columns c ON
    c.object_id = o.object_id AND
    c.system_type_id = 167
WHERE
    o.name = 'tableName'

您确定类型167是您需要检查的所有内容吗?

答案 1 :(得分:0)

我不肯定如何在SQL中实现这一点,但我怀疑你需要生成一个SQL字符串然后执行。我一直使用Notepad ++来做这类事情。

  1. 通过换行符将字段名列表复制到新文件中
  2. 控制+ R
  3. 启用正则表达式
  4. 查找^(。+)$
  5. 替换为“\ 1LenMatch AS CASE when DATALENGTH(\ 1)= DATALENGTH(RTRIM(\ 1))THEN 1 ELSE 0 END,”或者您需要的任何SQL行,并包含\ 1您希望字段名称为去。

答案 2 :(得分:0)

从字面上看,如果你想避免两次输入字段名,请让SQL Server为你做输入。

Select ' Or DataLength(' + Name + ')<>DataLength(RTrim(' + Name + '))'
  From sys.Columns
 Where Object_ID=Object_ID('Employees')
   And System_Type_ID=167

(注意,你真的不需要显式引用sys.tables,Object_ID函数会为你做这个!)

然而,我认为你真正要求的是如何检测一个值是否以一个或多个空格结束而不用这种方式比较长度。答案是使用存储的函数。

Create Function Dbo.EndsWithSpaces(@Value Varchar(8000)) Returns Bit
As Begin
  Return Case When DataLength(@Value)=DataLength(RTrim(@Value)) Then 0
              Else 1 End
End

现在您可以检查任何值的尾随空格:Dbo.EndsWithSpaces(Value)=1当然,您仍然可以让SQL Server为您生成Where子句的结尾:

Select ' Or Dbo.EndsWithSpaces(' + Name + ')=1'
  From sys.Columns
 Where Object_ID=Object_ID('Employees')
   And System_Type_ID=167

答案 3 :(得分:0)

另一种方法是反转字符串并检查第一个空格。如果它是1,则数据末尾有一个空格。如果它为0,则没有空格。如果它大于1,则有一个空格,但它不在数据的末尾。

例如:

Select Columns...
From   Table
Where  CharIndex(' ', Reverse(ColumnName)) = 1