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

时间:2017-04-09 03:19:34

标签: sql-server tsql

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类型。

2 个答案:

答案 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函数过滤掉记录。