脚本问题Transact-SQL

时间:2012-04-20 13:57:42

标签: sql tsql stored-procedures

我想从使用数据库返回所有表名,但这只返回一个char

declare @contador int

set @contador = 1

while (@contador<=(select count(table_name) from INFORMATION_SCHEMA.TABLES))
begin
declare @tableName varchar
    set @tableName =  (select top 1 * from (select top(@contador) table_name from INFORMATION_SCHEMA.TABLES order by table_name asc) as nombre order by table_name desc)
    print @tableName
    set @contador = @contador + 1
end

输出为s 小号 小号 小号 小号 小号

5 个答案:

答案 0 :(得分:3)

declare @tableName varchar(100)

您需要定义@tableName的长度,默认情况下它设置为1个字符。

答案 1 :(得分:1)

试  declare @tableName varchar(100)

答案 2 :(得分:1)

您需要更改您的tablename以获得字符数的值。目前该值默认为一。我建议你提供一个比你想象的更大的价值,以确保所有的桌子都适合在场地内。

答案 3 :(得分:1)

declare @tableName varchar的大小需要varchar(50)

答案 4 :(得分:1)

T-SQL的类型为SYSNAME,用于存储表名等内容:

  

sysname数据类型用于表列,变量和存储   存储对象名称的过程参数。确切的定义   sysname与标识符规则相关。因此,它可以   因SQL Server实例而异。 sysname在功能上是相同的   as nvarchar(128),但默认情况下,sysname为NOT NULL。在   在早期版本的SQL Server中,sysname被定义为varchar(30)。

所以尝试像这样声明你的变量:

DECLARE @tableName SYSNAME;

如果表名包含当前代码页以外的字符或超过100个字符,则使用其他答案中建议的VARCHAR(100)声明将失败。

SQL Server的rules for identifiers摘录描述了表名的形式:

  
      
  1. 第一个字符必须是以下之一:

         
        
    • Unicode标准3.2定义的字母。 Unicode   字母的定义包括从a到z的拉丁字符   A到Z,还有其他语言的字母。

    •   
    • 下划线(_),符号(@)或数字符号(#)。

    •   
    • 标识符开头的某些符号具有特殊含义   在SQL Server中。以at符号开头的常规标识符   always表示局部变量或参数,不能用作   任何其他类型对象的名称。以a开头的标识符   数字符号表示临时表或程序。一个标识符   以双数字符号开头(##)表示全局临时符号   宾语。虽然数字符号或双数字符号可以   用于开始其他类型对象的名称,我们没有   推荐这种做法。

    •   
    • 某些Transact-SQL函数的名称以符号开头为double   (@@)。为避免与这些功能混淆,您不应该使用   以@@开头的名字。

    •   
  2.   
  3. 后续字符可包含以下内容:

         
        
    • Unicode标准3.2中定义的字母。

    •   
    • 来自Basic Latin或其他国家/地区脚本的十进制数字。

    •   
    • at符号,美元符号($),数字符号或下划线。

    •   
  4.   
  5. 标识符不能是Transact-SQL保留字。 SQL Server   保留保留字的大写和小写版本。

  6.   
  7. 不允许使用嵌入空格或特殊字符。

  8.   
  9. 不允许使用补充字符。

  10.   

有关详细信息,请参阅我的答案中的文档链接。