0

这行代码有什么问题?SELECT
'IF (SELECT COLUMNPROPERTY('+ OBJECT_ID('' [+ TABLE_SCHEMA +''].[ ' + TABLE_NAME +] ''+',' + ''U'')+',' +''COLUMN_NAME'' +','+ ''AllowsNull''+')) =0'

我正在尝试编写列的可空性脚本。这是脚本的一部分,而不是整个脚本。这条线让我很难过。

4

1 回答 1

0

看起来您正在将无效参数传递给 columnproperty() 函数。

这是一个使用 Adventure Works 2012 数据库的带有和不带有动态 sql 的示例。

第一个示例返回表“ProductListPriceHistory”的所有列及其可为空性。

第二个示例创建动态 TSQL,只为同一表中的“EndDate”列返回一行。它将行存储在可以使用 IF 语句查询的表变量中。我喜欢在测试时查看所有相关数据;因此,我使用了一个表变量来存储关键数据。

我希望这能解决你的问题。

祝你好运。

约翰

-- Test database
use AdventureWorks2012
go

--
-- Non dynamic SQL
--

SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'AllowsNull') AS AllowsNulls
FROM AdventureWorks2012.INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'ProductListPriceHistory'
GO


--
-- Dynamic SQL
--

-- table variable
declare @var_table TABLE
(
    TABLE_NAME varchar(256),
    COLUMN_NAME varchar(256),
    ALLOWS_NULLS int
);

-- tsql stmt
declare @var_tsql varchar(max) = 
  'USE AdventureWorks2012; ' + 
  ' SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + ''.'' + TABLE_NAME), COLUMN_NAME, ''AllowsNull'') AS ALLOWS_NULLS ' + 
  ' FROM INFORMATION_SCHEMA.COLUMNS ' +
  ' WHERE TABLE_NAME = ''ProductListPriceHistory'' AND ' + 
  ' COLUMN_NAME = ''EndDate'' ';

-- save to variable
insert into @var_table
exec (@var_tsql);

-- query the variable
select ALLOWS_NULLS from @var_table;

语句的输出。

在此处输入图像描述

更多用户示例:

-- tsql stmt
declare @var_tsql varchar(max) = 
' IF (SELECT COLUMNPROPERTY(OBJECT_ID(''[Production].[ProductListPriceHistory]'',''U''), ''EndDate'', ''AllowsNull'')) = 1 
   PRINT ''Field allows null''
ELSE 
   PRINT ''Field does not allow null'' ';

-- run the statement
exec (@var_tsql);


-- tsql stmt
set @var_tsql  = 
' IF (SELECT COLUMNPROPERTY(OBJECT_ID(''[Production].[ProductListPriceHistory]'',''U''), ''ProductID'', ''AllowsNull'')) = 1 
   PRINT ''Field allows null''
ELSE 
   PRINT ''Field does not allow null'' ';

-- run the statement
exec (@var_tsql);

输出如下。

字段允许为空 字段不允许为空

于 2013-09-30T12:47:58.350 回答