Sql server 使用输出参数执行SQL(使用IF条件)

Sql server 使用输出参数执行SQL(使用IF条件),sql-server,tsql,Sql Server,Tsql,上面的代码是一个存储过程的一部分,我使用它来获取所有表及其主键的列表(除一个表外,主要是整数)并获取它们的最大值 对于包含变量@primarykey的INT值的表来说,这很好 我的问题是,是否有一种方法可以在查询中/之前包含一个条件,以便在执行带有错误的查询之前检查INT type。我不确定我是否完全理解您的代码,但看起来您使用的是全局临时表。也许你应该先用ISNUMERIC函数过滤掉记录。我想知道你会用这种东西做什么,这个操作提供了什么价值 一般说明: 在循环外部声明变量,并在循环内部重置它

上面的代码是一个存储过程的一部分,我使用它来获取所有表及其主键的列表(除一个表外,主要是整数)并获取它们的最大值

对于包含变量@primarykey的INT值的表来说,这很好


我的问题是,是否有一种方法可以在查询中/之前包含一个条件,以便在执行带有错误的查询之前检查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;