我刚刚设置了一个测试床,并禁用了访问information_schema (弱waf),并且我一直试图从数据库中提取表列表,方法是使用convert输出包含的信息的转换错误。要提取版本,我们使用语法:+and+1=convert(int,@@ version ),结果如下:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 R2 (SP2) Copyright (c) Microsoft Corporation Standard Edition Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) ' to data type int.查询的结果是单引号中的内容。现在,要从数据库中获取第一个表,通常需要使用:
convert(int,(select+top+1+table_name+from+information_schema.tables))这将导致错误:
Microsoft OLE DB Provider for SQL Server error '80040e07'
Conversion failed when converting the nvarchar value 'tblDepartement' to data type int.
index.asp, line 30同样,答案在两个单引号内,即tblDepartement。提取表名的另一种方法是使用以下两个查询:
(A):SELECT name FROM sys.tables(B):select * from sys.tables。如果我用这个语法尝试(A):
convert(int,(select name FROM sys.tables))我知道错误:
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near the keyword 'from'. 如果我尝试(B)使用以下语法:convert(int,(select * FROM sys.tables)),则会得到错误:
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '*'. 因此,我的问题是,如何不使用information_schema,而在转换语法中使用sys.tables,以便从数据库中获取表列表?谢谢。
发布于 2014-03-02 23:03:26
函数需要一个表达式,如果是子查询,则必须是标量:
{ constant | scalar_function | [ table_name. ] column | variable
| ( expression ) | ( scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
| ranking_windowed_function | aggregate_windowed_function
}此外:
scalar_subquery ( ) 返回一个值的子查询。例如: 从产品中选择MAX(UnitPrice)
因此,替换表达式的子查询只能返回一个值,因此既不能返回多列,也不能返回多行。
对于您的查询(A)和(B),由于表表有多个列和多个行,因此不满足这一限制。
要枚举所有表名,只需分别请求每个表名,如下所示:
CONVERT(INT, (
SELECT TOP 1 table_name
FROM (
SELECT table_name, ROW_NUMBER() OVER (ORDER BY table_name) AS row_num
FROM information_schema.tables
) t
WHERE row_num > 123
))不幸的是,Transact-SQL需要这种ROW_NUMBER()来选择偏移量。
https://stackoverflow.com/questions/21812224
复制相似问题