Sql server 使用输出参数执行SQL(使用IF条件)
上面的代码是一个存储过程的一部分,我使用它来获取所有表及其主键的列表(除一个表外,主要是整数)并获取它们的最大值 对于包含变量@primarykey的INT值的表来说,这很好Sql server 使用输出参数执行SQL(使用IF条件),sql-server,tsql,Sql Server,Tsql,上面的代码是一个存储过程的一部分,我使用它来获取所有表及其主键的列表(除一个表外,主要是整数)并获取它们的最大值 对于包含变量@primarykey的INT值的表来说,这很好 我的问题是,是否有一种方法可以在查询中/之前包含一个条件,以便在执行带有错误的查询之前检查INT type。我不确定我是否完全理解您的代码,但看起来您使用的是全局临时表。也许你应该先用ISNUMERIC函数过滤掉记录。我想知道你会用这种东西做什么,这个操作提供了什么价值 一般说明: 在循环外部声明变量,并在循环内部重置它
我的问题是,是否有一种方法可以在查询中/之前包含一个条件,以便在执行带有错误的查询之前检查INT type。我不确定我是否完全理解您的代码,但看起来您使用的是全局临时表。也许你应该先用ISNUMERIC函数过滤掉记录。我想知道你会用这种东西做什么,这个操作提供了什么价值 一般说明: 在循环外部声明变量,并在循环内部重置它们。 使用sysname作为脚本中向前和向后兼容的系统对象的名称。 您可以通过一次选择设置多个变量。 在可能包含空格或其他字符的对象名称周围使用quotename,动态sql需要在方括号中换行。 您可能会使用本地临时表而不是全局临时表。 您可以为datatype添加一列,并将其包含在tmp_tname_pkey_map的生成中,以简化此过程。
填充临时表列表索引时,可能还设置了类型,然后有两个可能的语句,一个用于ints,另一个用于任何其他类型。@SqlZim-上述代码是存储过程的一部分,它创建了一个表,其中包含架构中每个表的Tablename、PrimaryKey、PrimaryKey的最大值。如果主键不是int/bigint类型,则在查询max primary key时失败。上面的代码是存储过程的一部分,它为架构中的每个表创建了一个包含Tablename、PrimaryKey、PrimaryKey的max value的表。当主键不是int/bigint类型时,查询max primary key时失败。感谢您上面的代码,我现在可以获取列的数据类型。谢谢。
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
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;