Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 如何在不重新键入字段名的情况下比较字段的修剪长度和未修剪长度?_Sql_Database_Sql Server 2005 - Fatal编程技术网

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

Sql 如何在不重新键入字段名的情况下比较字段的修剪长度和未修剪长度?,sql,database,sql-server-2005,Sql,Database,Sql Server 2005,基本上,我想检查varchar字段中文本右侧是否有空格。为此,我想将DATALENGTH(fieldName)与DATALENGTH(RTRIM(fieldName))进行比较 这并不难 唯一的问题是,我需要对五个表中的所有varchar字段执行此操作。我需要用这种方法比较大约250个字段。有没有一种方法可以将所有字段名放入一个查询中,而不必键入每个字段的名称2x 我使用这个查询来获取需要查看的字段的名称 SELECT name FROM sys.columns WHERE object_id

基本上,我想检查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)


谢谢

如果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类型吗?

我不确定如何在SQL中实现这一点,尽管我怀疑您需要生成一个SQL字符串,然后执行。我总是用记事本++来做这类事情

  • 将字段名列表复制到以换行符分隔的新文件中
  • Ctrl+R
  • 启用正则表达式
  • 查找^(+)$
  • 替换为“\1在DATALENGTH(\1)=DATALENGTH(RTRIM(\1))时匹配,然后1 ELSE 0结束”,或您需要的任何sql行,并在希望字段名的位置包含\1

  • 从字面上讲,如果您想避免两次键入字段名,请让SQL Server为您键入字段名

    Select ' Or DataLength(' + Name + ')<>DataLength(RTrim(' + Name + '))'
      From sys.Columns
     Where Object_ID=Object_ID('Employees')
       And System_Type_ID=167
    
    现在您可以检查尾随空格中的任何值:
    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
    

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

    例:


    如果使用“%”之类的
    where列,则只需键入一次名称即可(是的-我只需要varchar字段。我只是想NVARCHAR可能也很重要,但可能您不使用这些字段,或者它们不相关。
    
    Select ' Or Dbo.EndsWithSpaces(' + Name + ')=1'
      From sys.Columns
     Where Object_ID=Object_ID('Employees')
       And System_Type_ID=167
    
    Select Columns...
    From   Table
    Where  CharIndex(' ', Reverse(ColumnName)) = 1