Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 供应商数据库包含具有100个用户定义字符串列的表,需要查找该表中所有不为null的匹配项_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 供应商数据库包含具有100个用户定义字符串列的表,需要查找该表中所有不为null的匹配项

Sql 供应商数据库包含具有100个用户定义字符串列的表,需要查找该表中所有不为null的匹配项,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个web应用程序的供应商数据库,其中有100个“用户定义字符串”列。它们的数据类型为varchar,长度为255 我需要返回所有不为null的行,以便找出每个行中存储的内容。由于无法控制多年来输入的内容,因此userdefinedstring1可以跨多行包含文本、日期、数字、空字符串或NULL 我的最初解决方案就是 SELECT * FROM userdefinedstring table WHERE userdefinedstring1 IS NOT NULL OR user

我有一个web应用程序的供应商数据库,其中有100个“用户定义字符串”列。它们的数据类型为varchar,长度为255

我需要返回所有不为null的行,以便找出每个行中存储的内容。由于无法控制多年来输入的内容,因此userdefinedstring1可以跨多行包含文本、日期、数字、空字符串或NULL

我的最初解决方案就是

SELECT 
* 
FROM userdefinedstring table 

WHERE userdefinedstring1 IS NOT NULL 

OR userdefinedstring2 IS NOT NULL 
又重复了98次


可能有更好的方法可以做到这一点,但我还没有决定,所以我们非常感谢您提供的任何建议

我能想到的唯一改进是在
WHERE
子句中使用
coalise
,而不是

SELECT *
FROM   userdefinedstringTable
WHERE  COALSECE( userdefinedstring1
               , userdefinedstring2
                ...
               ) IS NOT NULL

根据您的DBMS产品,可能有特定于供应商的改进方法,但一般来说,这可能是最好的方法。

RBarry的COALESCE是一个好主意,您可以使用它列出所有感兴趣的列:

SELECT c.name ColumnName
FROM sys.columns AS c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
WHERE t.name = 'varchar' 
   AND t.max_length = 255 
ORDER BY c.OBJECT_ID;
使用EXCEL快速创建查询的好机会:
=A1&“,”
向下复制以制作你的恶棍
合并
语句。

以下是在所有列上生成合并的查询:

SELECT 'SELECT *
        FROM   userdefinedstringTable
        WHERE COALESCE ('  + STUFF(
        (SELECT ', [' + name + ']'
        FROM sys.columns WHERE Object_ID = object_id('userdefinedstringTable')
        FOR XML PATH (''))
    , 1,1,'')  + ') IS NOT NULL'

您是否有一个包含98个字段的表?您只需指定有一个“数据库”就可以了。SQL 2008是指SQL Server 2008吗?是的,SQL Server 2008感谢您的澄清。我编辑了这个问题,以反映这是数据库中的一个表。这是为了溢出的目的,我需要弄清楚它是如何被使用的。问题是“SQL 2008”,但没有标记,感谢共享标准,很高兴离开我的SQL Server世界。谢谢你的回答。在本例中,基于我有限的查询,统计数据显示合并速度大约快33%。