--在动态sql中,无论exec还是exec sp_executesql,都不允许使用参数形式的表名和列名,
--你可以使用变量或者在存储过程中使用存储过程参数声明部分的参数,而不是直接使用
--exec sp_executesql参数声明部分的参数
--典型的错误代码(there is no wrong with grammer,but not any row is returned)
declare @outPutValue as int,
@schemaname as nvarchar(50),
@tablename as nvarchar(50),
@filtercolumn as nvarchar(50),
@columnvalue as nvarchar(50),
@sql nvarchar(max);
set @schemaname='dbo';
set @tablename='orders';
set @filtercolumn='employeeid';
set @columnvalue='1';
set @sql='select count(*) from '+quotename(@schemaname)+'.'+quotename(@tablename)
+' where @fc=@cv ';--使用了参数形式的列名 the error occur
exec sp_executesql
@sql,
N'@fc as nvarchar(50),@cv as nvarchar(50),@outValue as int output',
@fc=@filtercolumn,
@cv=@columnvalue,
@outValue=@outPutValue output;
print @outPutValue;
print @sql;
--solution 1-----使用变量的方式为动态sql静态提供选择列,表名,过滤列
--此解决方案并展示了如何使用exec sp_executesql的输出参数
use northwind;
go
declare @outPutValue as int,
@schemaname as nvarchar(50),
@tablename as nvarchar(50),
@filtercolumn as nvarchar(50),
@columnvalue as nvarchar(50),
@countname as nvarchar(50),
@sql nvarchar(max);
set @schemaname='dbo';
set @tablename='orders';
set @filtercolumn='employeeid';
set @columnvalue='1';
set @countname='orderid';
set @sql='select @outValue=count('+@countname --使用了输出参数
+') from '
+quotename(@schemaname)+'.'+quotename(@tablename)
+' where '+@filtercolumn+'=@cv ';
exec sp_executesql
@sql,
N'@fc as nvarchar(50),@cv as nvarchar(50),@outValue as int output',
@fc=@filtercolumn,
@cv=@columnvalue,
@outValue=@outPutValue output;--使用输出参数为变量@outPutValue赋值,变量后加关键字output
print @outPutValue;
print @sql;
go
--solution 2-使用存储过程的参数为动态sql动态提供选择列,表名,过滤列
use NorthWind;
go
alter PROCEDURE GetData
@tbName nvarchar(50),
@colName nvarchar(50),
@Name nvarchar(50),
@filtername nvarchar(50)
AS
BEGIN
declare @sql nvarchar(max);
set @sql='select '+ @colName+' from ' +@tbName+ ' where '+@filtername+'=@whereName';
--注意此句不可以写成如下:
-- set @sql='select @colName from @tbName where employeeid=@whereName';
exec sp_executesql
@sql,
N'@whereName nvarchar(20)',
@Name
print @sql;
END
exec GetData
@name=N'1',
@tbName=N'dbo.Orders',
@colName=N'employeeid',
@filtername=N'employeeid';
conclusion:solution1 和solution 2 都成功避开了,不能直接使用参数形式的列名和表名的限制,
solution1使用的变量的方式是静态的,
solution2使用的是存储过程的参数的方式是动态的,这种方式可用性更强。
分享到:
相关推荐
本文将详细探讨如何使用PL/SQL来实现获取数据库中所有表名及其列名,并存储到一个特定的表中。 ### 一、理解需求与设计思路 #### 1. 需求分析: 我们的目标是创建一个PL/SQL程序,该程序能够遍历当前用户拥有的...
标题“sql注入_表名、列名字典”提示我们,这个话题将涉及到如何通过SQL注入来获取数据库中的表名和列名。 在描述中,“union select * from 表名字典 union select 列名字典 from 表名”是一个典型的SQL注入攻击...
在SQL Server中,动态执行SQL语句有两个主要的命令:`EXEC`和`SP_EXECUTESQL`。两者都用于在运行时执行SQL语句,但它们之间存在显著的区别。 一、EXEC `EXEC`命令可以执行存储过程或者动态SQL语句。当我们需要执行...
Exec sp_executesql N select * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = FiledName Select @...
这通常涉及将字符串拼接成完整的SQL命令,然后使用`EXEC`或`sp_executesql`存储过程来执行这个命令。下面是一个简单的例子: ```sql DECLARE @tableName NVARCHAR(100) = 'MyTable'; DECLARE @sqlCommand NVARCHAR...
SQL_EXEC 命令是一种重要的 SQL 语句,它可以执行存储过程或动态批次。动态批次是一个内容为 SQL 语句的字符串。例如,以下代码将执行一个 select 语句: declare @schemaName varchar(80),@tableName varchar(80),...
本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意事项。 #### 动态SQL与`sp_executesql` 动态SQL是指在运行时构建的SQL语句,这种类型的SQL可以在不...
假设我们需要根据用户输入的列名动态生成一个SELECT查询,可以这样编写: ```sql DECLARE @colName NVARCHAR(50) = 'ColumnName'; DECLARE @sql NVARCHAR(MAX) = N'SELECT ' + QUOTENAME(@colName) + ' FROM ...
"SQL_SET.rar_SetSQL_sql_sql set _sql set connectattr_sql set rouc"这个标题可能是在暗示一系列关于SQL中的"SET"关键字的教程或者文档集合,包括设置SQL语句、连接属性以及可能涉及到的行计数相关设置。...
本文主要给大家介绍的是关于SQL Server查找包含空格的表和列的相关内容,为什么会有这篇文章,是因为最近发现一个数据库中的某个表有个字段名后面包含了一个空格,这个空格引起了一些小问题,一般出现这种情况,是...
在SQL Server中,`EXEC` 和 `sp_executesql` 都是用来动态执行SQL语句的命令,但它们之间存在着显著的区别。这篇文章将详细解析这两个命令的用途、优缺点以及如何选择适合的使用场景。 首先,`EXEC` 命令主要用于...
ALTER TABLE 表名 ADD CONSTRAINT FK__表名__列名 FOREIGN KEY (列名) REFERENCES 另一表名 (列名); ``` #### 4. 数据插入 插入数据到表中是常见的操作之一,可以通过`INSERT INTO`命令完成: - 插入单条记录: ```...
本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...
4. **自动提示**:SQL Plus具有命令和对象名的自动完成功能,有助于快速输入长命令或表名、列名等。 5. **错误处理**:在执行脚本时,如果遇到错误,SQL Plus会停止执行,并显示错误信息,方便定位问题。 6. **...
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select ...
标题中的“Kettle循环执行动态SQL”指的是使用Pentaho Data Integration(Kettle)工具来设计数据集成工作流,其中包含动态生成并执行SQL语句的步骤。在数据处理和ETL(Extract, Transform, Load)过程中,动态SQL是...
针对这一需求,有一个名为"从SQL脚本抽取数据库表名小工具.zip"的压缩包,它包含了一个Python小工具,专门用于从SQL脚本中高效地提取出所有引用的表名。 这个Python小工具的核心功能是利用正则表达式(Regular ...
最后,关于约束的命名,建议遵循一定的规范,如主键约束 `PK_表名_列名`,检查约束 `CK_表名_列名`,默认约束 `DF_表名_列名`,唯一约束 `UQ_表名_列名` 和外键约束 `FK_表名_列名`。这样命名有助于日后的维护和理解...
与静态 SQL 不同,静态 SQL 需要预先知道每个 SQL 语句的确切内容,如表名、列名、where 子句检查了哪些列。 动态 SQL 的优点是可以很好的响应用户输入的内容,能够根据用户的输入动态改变 SQL 语句的内容。在 ...