SQL,将选择列分配给变量

时间:2014-08-08 19:01:36

标签: sql-server

我正在使用SQL Server 2012,我将创建一个存储过程,它从一个变量中的表中复制一个列,有没有人可以告诉我这个代码有什么错误?

  alter Procedure Id_Fetch
  @Col varchar(50)=null,
  @Table VARCHAR(50)=Null,
  @OrdrBy Varchar(40)=null
 as 
 Begin
declare @TempCol nvarchar (100)
Exec(' SELECT '+@TempCol+' = '+@Col+' from ' + @Table +' order by '+@OrdrBy )

显示错误“'='

附近的语法错误

1 个答案:

答案 0 :(得分:0)

稍加修改......在你的选择中使用TOP 1,好像你选择了多个值,它会引发一个错误。

使用SYSNAME数据类型作为列名和表名。

在对象名参数周围使用QUOTENAME()函数,它在传递的参数值周围放置方括号[],并强制将其视为对象名称(防止Sql注入攻击)。

使用sp_executesql代替EXEC并将参数值连接到字符串中并再次执行可以防止Sql注入攻击。

ALTER PROCEDURE Id_Fetch
   @Col         SYSNAME,
   @Table       SYSNAME,
   @OrdrBy      SYSNAME,
   @Col_Value   NVARCHAR(100) OUTPUT
AS 
BEGIN
  SET NOCOUNT ON;

    DECLARE @Sql NVARCHAR(MAX);

  SET @Sql =  N' SELECT TOP 1 @Col_Value = ' + QUOTENAME(@Col) 
            + N' FROM ' + QUOTENAME(@Table) 
            + N' ORDER BY ' + QUOTENAME(@OrdrBy)  

  EXECUTE sp_executesql @Sql
                       ,N'@Col_Value  NVARCHAR(100) OUTPUT'
                       ,@Col_Value OUTPUT

END