DECLARE @counter INT = 1
WHILE ((SELECT count(*) from ##tmp_tname_pkey_map) >= @counter-1)
BEGIN
DECLARE @table varchar(250);
DECLARE @primarykey varchar(250);
SELECT @table = TABLE_NAME from ##tmp_tname_pkey_map where INDEX_ID = @counter;
SELECT @primarykey = PRIMARY_KEY_COLUMN from ##tmp_tname_pkey_map where INDEX_ID = @counter;
DECLARE @query nvarchar(max);
DECLARE @maxVal BIGINT;
SET @query = 'SELECT @maxVal = max(' + @primarykey + ') from ' + @table;
EXEC sp_executesql @query, N'@maxVal INT out', @maxVal out
上面的代码是存储过程的一部分,我用它来获取所有表及其主键的列表(主要是INTEGERS除了一个表)并获得它们的最大值。
这适用于包含变量@primarykey的INT值的表。
我的问题是,在查询执行错误之前,是否有办法在查询中/之前包含条件来检查INT类型。
答案 0 :(得分:0)
我很想知道你会用这种东西做什么,这个操作有什么价值呢?
<小时/> 一般说明:
sysname
作为系统对象的名称,以便在脚本中实现前向(和后向)兼容性。select
设置多个变量。quotename()
,这些对象名称可能包含空格或其他字符,需要用方括号括起动态sql。datatype
添加一列,并将其包含在##tmp_tname_pkey_map
的生成中,以简化此流程。declare @table sysname, @primarykey sysname, @primarykey_datatype sysname;
declare @query nvarchar(max);
declare @maxVal bigint;
declare @count int = (select count(*) from ##tmp_tname_pkey_map);
declare @i int = 1;
while (@i <= @count)
begin;
/* reset variables */
select
@table = null
, @primarykey = null
, @primarykey_datatype = null
, @query = null
, @maxVal = null;
/* get variable values from temp table */
select
@table = table_name
, @primarykey = primary_key_column
, @query = 'select @maxVal = max(' + quotename(primary_key_column)
+ ') from ' + quotename(table_name)+';';
from ##tmp_tname_pkey_map
where index_id = @i;
/* using system catalog views to get the datatype of a column */
select @primarykey_datatype = y.name
from sys.tables t
inner join sys.columns c
on t.object_id = c.object_id
inner join sys.types y
on c.user_type_id = y.user_type_id
where t.name = @table
and c.name = @primarykey;
/* check primary key data type, set @query null if not integer based */
if @primarykey_datatype not in ('tinyint', 'smallint', 'int', 'bigint')
begin;
set @query = null;
print @table +' primary key '+@primarykey+' datatype is: '+@primarykey_datatype;
end;
/* execute @query if it is not null */
if @query is not null
begin;
exec sp_executesql @query, N'@maxVal int output', @maxVal out;
end;
/* increment loop counter @i */
set @i = @i + 1;
end;
答案 1 :(得分:-1)
我不确定我是否完全理解您的代码,但看起来您正在使用全局临时表。也许您应该首先使用ISNUMERIC函数过滤掉记录。