我正在使用存储过程根据传递给它的参数动态生成一个创建表脚本。我正在验证服务器是否存在,然后验证该表是否存在于所述服务器上的数据库中。
所以,首先我检查服务器是否存在:
Exists(SELECT 1 FROM sys.servers WHERE name = @Server)
如果它通过了这个检查,我将继续构建一个指向的字符串Information_schema
:
set @InformationSchemaPath = @Server + '.' + @DataBaseName + '.' + 'information_schema'
然后在放入字符串的动态 SQL 语句中使用该字符串:
set @DynamicSQL = ('SELECT count(*)
FROM ' + @InformationSchemaPath + '.Tables
WHERE TABLE_NAME = ''' + @TableName + '''')
结果被插入到临时表中:
INSERT INTO @receiver Exec (@DynamicSQL )
我无法使用SP_EXECUTESQL。我坚持使用Exec。
是的,这是不安全的。尝试传递这个:
避免这种情况的一种方法是将
@TableName
其作为参数传递给动态 SQL。像这样:然后这样做:
从你问题的措辞来看,我不确定你是说你不能运行
sp_executesql
还是你不确定语法。如果您必须仅使用EXEC
一种方法运行该语句,但只能在链接服务器上使用。你这样做:其次是:
是的,它仍然很脆弱。@DatabaseName 参数可以包含终止一个命令并启动另一个命令的代码。您正在创建一个基于 @DatabaseName 的字符串,然后执行它。这是一个典型的 SQL 注入漏洞。