--有如下SQL语句,怎么写才能在dbo.ReturnOrderbyColumn()中使用在动态语句中定义的@RKEY:
DECLARE @SQL VARCHAR(1000)SET @SQL='
DECLARE @RKEY INT 
SET @RKEY=27781
SELECT * FROM DATA0050 '+dbo.ReturnOrderbyColumn(@RKEY)+''
PRINT @SQL

解决方案 »

  1.   

    函数返回的结果如果是字符串,可以拼接的。
    如果是int,会提示类型转换失败。函数内部不能exec,所以在函数里面是不能动态拼接的。
      

  2.   

    14在数据库中拼字符串,也可以用参数  在实际的开发中,某些情况下在数据库中拼字符串不可避免,但又担心有特殊字符,导致拼出来的SQL有问题,其实数据库中拼字符串也可以使用参数,这就要用到dbo.sp_executesql ,这样就可以避免SQL注入和特殊字符导致的错误如DECLARE @IntVariable INT;--定义变量
    DECLARE @SQLString NVARCHAR(500);--存储拼出来的SQL
    DECLARE @ParmDefinition NVARCHAR(500);---存储拼出来的SQL中的参数
    /* Build the SQL string one time. */
    SET @SQLString =
         N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID';
    /* Specify the parameter format one time. */
    SET @ParmDefinition = N'@SalesID int';--赋值/* Execute the string with the first parameter value. */
    SET @IntVariable = 275;--赋值
    EXECUTE dbo.sp_executesql  @SQLString, @ParmDefinition,
                          @SalesID = @IntVariable;
    /* Execute the same string with the second parameter value. */
    SET @IntVariable = 276;
    EXECUTE dbo.sp_executesql  @SQLString, @ParmDefinition,
                          @SalesID = @IntVariable;
      

  3.   


    To:maco_wangdbo.ReturnOrderbyColumn()这个函数返回的是字段串。
    下面我讲下我的需求吧,可能你们有更好的解决办法储存过程会接收一个参数@RKEY 它的值是类似于 '111,222,333,'
    我想在动态SQL 里根据','分割@RKEY,分别将111,222,333 传给dbo.ReturnOrderbyColumn()
    然后在动态SQL里每次设置 SET @RKEY=SUBSTRING(@RKEY,CHARINDEX(',',@RKEY)+1,LEN(@RKEY))能不能在动态SQL里设置参数@RKEY的值,就是下面这步操作
    SET @RKEY=SUBSTRING(@RKEY,CHARINDEX(',',@RKEY)+1,LEN(@RKEY))
      

  4.   


    declare @table table (id int,col varchar(1))
    insert into @table
    select 101,'a' union all
    select 201,'b' union all
    select 301,'c' union all
    select 409,'d'declare @userid varchar(2000),
    @sqlstr varchar(4000)
    set @userid='201,102,301,104,199'SELECT * FROM @table 
    WHERE CHARINDEX(','+CAST(id AS VARCHAR(4))+',',','+@userid+',')>0
    /*
    id          col
    ----------- ----
    201         b
    301         c
    */是不是这个意思?