这是一个有点标新立异,但试试这个:
--set up test table
--the BEGIN TRY and ALTERs allow you to rerun entire script over and over again
BEGIN TRY
CREATE TABLE YourTable (PK int not null primary key, RowValue1 int null, RowValue2 varchar(5) null, RowValue3 datetime)
END TRY
BEGIN CATCH END CATCH
delete YourTable
ALTER TABLE YourTable ALTER COLUMN RowValue1 int NULL
ALTER TABLE YourTable ALTER COLUMN RowValue2 varchar(5) NULL
ALTER TABLE YourTable ALTER COLUMN RowValue3 datetime NULL
--setup test data
INSERT INTO YourTable VALUES (1,1111,'AAAA',GETDATE())
INSERT INTO YourTable VALUES (2,2222,'BBBB',GETDATE())
INSERT INTO YourTable VALUES (3,3333,'CCCC',GETDATE())
INSERT INTO YourTable VALUES (4,NULL,'DDDD',GETDATE())
INSERT INTO YourTable VALUES (5,5555,'EEEE',NULL)
--determine null columns
DECLARE @BadColumns varchar(50)
BEGIN TRY
ALTER TABLE YourTable ALTER COLUMN RowValue1 int NOT NULL
END TRY
BEGIN CATCH
SET @BadColumns=ISNULL(@BadColumns+', ','')+'RowValue1'
END CATCH
----------------------------------
BEGIN TRY
ALTER TABLE YourTable ALTER COLUMN RowValue2 varchar(5) NOT NULL
END TRY
BEGIN CATCH
SET @BadColumns=ISNULL(@BadColumns+', ','')+'RowValue2'
END CATCH
----------------------------------
BEGIN TRY
ALTER TABLE YourTable ALTER COLUMN RowValue3 datetime NOT NULL
END TRY
BEGIN CATCH
SET @BadColumns=ISNULL(@BadColumns+', ','')+'RowValue3'
END CATCH
--report null columns
SELECT @BadColumns AS [Columns having NULLs]
OUTPUT:
Columns having NULLs
--------------------------------------------------
RowValue1, RowValue3
(1 row(s) affected)
如果你需要动态,因为你不知道列名,你可以建立一个类似的命令到一个字符串然后执行。
为什么?什么类型的应用程序需要这个?你也可以在你的查询中加入'AND c.is_nullable = 1'来只循环可能有空的列。 –
在将数据移到生产数据库之前,这是从供应商处提供给我们的数据时检查数据所必需的。这是一个标准的质量控制检查。 – Brian