我有以下问题。我在数据库中有一个表,有很多列。我可以执行不同类型的选择查询,例如,显示满足条件的每条记录:
要获取列列表以形成查询,我使用信息架构。
现在,问题是:每个查询都返回一个包含大表列的子集的记录。这意味着我可以获得一行(所有!)NULL。如何让我的查询拒绝这些行而不必明确键入列名(即通过说col_1不为空,col_2不为空...)?有可能吗?
提前致谢!!!
月
答案 0 :(得分:0)
我一直在寻找同样的东西,我认为这不可能。
唯一合适的解决方案似乎是从Bytes.com:
命名SELECT
CASE WHEN patientid IS NULL THEN 1 ELSE 0 END+
CASE WHEN age IS NULL THEN 1 ELSE 0 END+
CASE WHEN weight IS NULL THEN 1 ELSE 0 END+
CASE WHEN height IS NULL THEN 1 ELSE 0 END+
CASE WHEN race IS NULL THEN 1 ELSE 0 END
FROM tblPatientDemographics
当然这没什么好玩的,所以我写了一些动态SQL来为我做这个。很优雅,但我不确定有更好的方法。
DECLARE @tableName SYSNAME
DECLARE @sql VARCHAR(MAX)
DECLARE @sqltail VARCHAR(MAX)
-- loop through all the fields in a table.
DECLARE @colName SYSNAME
SET @tableName = 'YourTableName'
DECLARE crsCol CURSOR FORWARD_ONLY READ_ONLY
FOR
SELECT name
FROM syscolumns
WHERE id = OBJECT_ID(@tableName)
ORDER BY colid
OPEN crsCol
SET @sql = ''
SET @sqltail = 'FROM [' + @tableName + ']'
FETCH NEXT FROM crsCol INTO @colName
WHILE @@FETCH_STATUS = 0
BEGIN
IF @sql = ''
SET @sql = 'SELECT /* Add Your PK Fields here, */ NullCount = '
ELSE
SET @sql = @sql + '+ '
SET @sql = @sql + 'CASE WHEN [' + @colName + '] IS NULL THEN 1 ELSE 0 END '
FETCH NEXT FROM crsCol INTO @colName
END
CLOSE crsCol
DEALLOCATE crsCol
PRINT (@sql + @sqltail)
EXEC(@sql + @sqltail)