Tsql 在T-SQL中,是否可以在给定行中找到包含NULL的列的名称(不知道所有列名)?

Tsql 在T-SQL中,是否可以在给定行中找到包含NULL的列的名称(不知道所有列名)?,tsql,null,Tsql,Null,在T-SQL中是否可以编写一个适当的查询来反映此伪代码: SELECT {primary_key}, {column_name} FROM {table} WHERE {any column_name value} is NULL i、 e.不明确引用每个列名 听起来很简单,但我已经搜索了很多遍,什么也没找到。您必须使用动态sql来解决这个问题。我已经演示了如何做到这一点。 使用此sql,您可以选择一个表,并检查id=1的行中的列是否为null和主键。我在脚本的底部包括了一个测试表。如果没有主

在T-SQL中是否可以编写一个适当的查询来反映此伪代码:

SELECT {primary_key}, {column_name}
FROM {table}
WHERE {any column_name value} is NULL
i、 e.不明确引用每个列名


听起来很简单,但我已经搜索了很多遍,什么也没找到。

您必须使用动态sql来解决这个问题。我已经演示了如何做到这一点。 使用此sql,您可以选择一个表,并检查id=1的行中的列是否为null和主键。我在脚本的底部包括了一个测试表。如果没有主键,也没有空列,代码将不会显示任何内容

DECLARE @table_name VARCHAR(20)
DECLARE @chosencolumn VARCHAR(20)
DECLARE @sqlstring VARCHAR(MAX) 
DECLARE @sqlstring2 varchar(100)
DECLARE @text VARCHAR(8000)
DECLARE @t TABLE (col1 VARCHAR(30), dummy INT)

SET @table_name = 'test_table'  -- replace with your tablename if you want
SET @chosencolumn = 'ID=1'      -- replace with criteria for selected row

SELECT @sqlstring = COALESCE(@sqlstring, '') + 'UNION ALL SELECT '',''''NULL '''' '' + '''+t1.column_name+''', 1000 ordinal_position FROM ['+@table_name+'] WHERE [' +t1.column_name+ '] is null and ' +@chosencolumn+ ' ' 
FROM INFORMATION_SCHEMA.COLUMNS t1
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE t2
ON t1.column_name = t2.column_name
AND t1.table_name = t2.table_name
AND t1.table_schema = t2.table_schema
WHERE t1.table_name = @table_name
AND t2.column_name is null

SET @sqlstring = stuff('UNION ALL SELECT '',''''PRIMARY KEY'''' ''+ column_name + '' '' col1, ordinal_position 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE table_name = ''' + @table_name+ '''' + @sqlstring, 1, 10, '') + 'order by 2'

INSERT @t
EXEC( @sqlstring)

SELECT @text = COALESCE(@text, '') + col1
FROM @t

SET @sqlstring2 ='select '+stuff(@text,1,1,'')

EXEC( @sqlstring2)
结果:

id           host_id      date         col1
PRIMARY KEY  PRIMARY KEY  PRIMARY KEY  NULL
试验台

CREATE TABLE [dbo].[test_table](
    [id] int not null,
    [host_id] [int] NOT NULL,
    [date] [datetime] NOT NULL,
    [col1] [varchar](20) NULL,
    [col2] [varchar](20) NULL,
 CONSTRAINT [PK_test_table] PRIMARY KEY CLUSTERED 
(
    [id] ASC,
    [host_id] ASC,
    [date] ASC
))
测试数据

INSERT test_table VALUES (1, 1, getdate(), null, 'somevalue')  

这并没有速记法——在大多数数据库设计中,这是一个不太可能的要求。由于没有人费心阅读或评分,我将其删除,并将其留给其他人回答。@t-clausen.dk-坚持下去,这些事情会发生(在SO和现实生活中)。如果你对自己的答案有信心,那就别提了。如果现在还得不到选票,以后可能会。但如果没有,那么它仍然表明你有知识和性格可以传递给别人。不知何故,我认为这个系统存在问题。如果我发现一个1岁的难题,答案为0,并给出正确答案。没有人会找到答案。像这样的问题,并不是很多人都会遇到的问题,所以如果有人真的费心去解决它,没人会在意。他们肯定不会为他们不太可能使用的解决方案打分。那些能够使用答案的铁杆人士通常不太可能用分数来奖励“竞争对手”。OP是一个1代表的家伙,那些人几乎从不给credit@t-clausen.dk-我鼓励您取消删除答案。即使它不能满足当前提问者的要求,它也可能会回答未来用户的搜索。虽然没有立即得到反馈让人失望,但有时注意到你的代表出现了上升(6个月,一年后),并被带回来重新审视你的答案是很好的,因为现在有人对它投了更高的票。但是,如果你只是为rep负责(而不是享受解决问题的乐趣),我不确定该建议什么来解决这个问题。