脚本问题事务处理 SQL



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

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

输出为 ssssss

declare @tableName varchar(100)

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

试试 declare @tableName varchar(100)

您需要更改表名以具有字符数的值。 目前,该值默认为 1。 我建议的值比您认为的要大得多,以确保所有表都适合该字段。

declare @tableName varchar需要具有类似于varchar(50)

的大小

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

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

因此,请尝试像这样声明变量:

DECLARE @tableName SYSNAME;

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

SQL Server 的标识符规则摘录描述了表名的形式:

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

    • 由 Unicode 标准 3.2 定义的字母。统一码 字母的定义包括从 a 到 z 的拉丁字符,从 A 到 Z,以及其他语言的字母字符。

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

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

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

  2. 后续字符可以包括以下内容:

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

    • 来自基本拉丁语或其他国家/地区脚本的十进制数字。

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

  3. 标识符不得是事务处理 SQL 保留字。SQL Server 保留保留字的大写和小写版本。

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

  5. 不允许使用增补字符。

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

最新更新