Sql server 如何使用用户给定的模式和表名构建sql查询

Sql server 如何使用用户给定的模式和表名构建sql查询,sql-server,python-3.x,pyodbc,Sql Server,Python 3.x,Pyodbc,我从用户那里获取输入,然后尝试从中构建查询 conn = pyodbc.connect(r'Driver={SQL Server};' 'Server=LOANER-001262;' 'Database=classic;' 'Trusted_Connection=yes;') cursor = conn.cursor() print("Executing!") dbname_name =

我从用户那里获取输入,然后尝试从中构建查询

conn = pyodbc.connect(r'Driver={SQL Server};'
                  'Server=LOANER-001262;'
                  'Database=classic;'
                  'Trusted_Connection=yes;')
cursor = conn.cursor()
print("Executing!")

dbname_name = input("Enter the schema name to scan :\t")
table_name = input("Enter the table_name you want to scan:\t")
query = cursor.execute('Select * FROM '{0}' table '{1}'' .format(dbname_name,table_name))
dataframe =pd.read_sql(query, con=conn)
Visual studio显示语法不正确。我该怎么写呢?我提到列名的方式是否与模式名和表名相同?
我使用的是pyodbc

您不能直接使用此语法 首先运行查询

Use [database_name]
然后运行查询

Select * from [table_name]
您的数据库名称存储在“dbname\u name”中。
然后执行查询
“使用”+dbname\u name

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                  'Server=ARUNTEST;'
                  'Database=PRODUCTDATABASESSAS;'
                  'Trusted_Connection=yes;')
schema_name = input("Enter the schema name to scan :\t")
table_name = input("Enter the table_name you want to scan:\t")
cursor = conn.cursor()
query = cursor.execute('Select * FROM {0}. 
{1}'.format(schema_name,table_name))
#cursor.execute('SELECT * FROM {0}'.format(table_name)) -> Use this if you 
want to call the table in default schema
for row in cursor:
print(row)
你能用上面的修改试试这个吗。默认情况下,在连接字符串中,您正在连接到Database Classic。如果表处于默认模式中,那么模式名称也可以省略,查询应该如下所示

从tablename中选择*

如果您想将它与模式一起使用,那么它应该是


从schemaname.tablename中选择*Use语句可以更具体一些。像exact synatx?“使用”+dbname\u name在功能上,您实际上想要实现什么?我真的不建议创建一个函数来打开游标并读取用户传入的整个表。我希望连接以获取输入并连接到特定的架构和表。目前只有1个模式和表,但它将进一步扩展,因此我需要运行程序的人员能够连接,并且我的代码在获取数据后修改数据。我可以从您创建的代码中看出这一点,但我的问题是:为什么?假设您允许返回任何表,那么您将无法控制函数的输出,例如,模式将完全不同。所以,我的问题是:用户需要做什么,为什么他们需要能够阅读任何表格,以及他们在之后用它做什么?您可能会发现,通过在数据库中创建特定的对象和过程,您可以更好地实现目标;然后,您可以查看在SQL Server中加密静止的敏感数据(搜索有关列加密的文章)和/或不返回那些不需要的列。除此之外,您还可以添加功能来筛选需要返回的记录,而不是转储整个表,这将再次降低违规风险。好的。但是如果数据库被破坏,那么攻击者是否能够解密列,因为他已经在数据库中了?如果用户输入包含空格的表(或架构)名称,则当前解决方案将失败。有些东西会更坚固。同意。。对于任何带有空格的名称,SQL server建议将其括在方括号[表名]之间。下面类似的内容query=cursor.execute('Select*FROM[{0}].[{1}]'.format(schema\u name,table\u name))这样更好一些,但是如果表名为
shift[am/pm]
…?是的。对于像shift[am/pm]…]这样的名称,它会失败@GordThompson谢谢你的建议。。我进行了编辑,以便在有空格时不会失败