sp_executesql是可以的。输入或输出参数      (1)输入参数:
          declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
          declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
          declare @input_id int--定义需传入动态语句的参数的值          set @QueryString='select * from tablename  where id=@id'  --id为字段名,@id为要传入的参数
          set @paramstring='@id int' --设置动态语句中参数的定义的字符串
          set @input_id =1  --设置需传入动态语句的参数的值为1
          exec sp_executesql @querystring,@paramstring,@id=@input_id  
          若有多个参数:
          declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
          declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
          declare @input_id int--定义需传入动态语句的参数的值,参数1
          declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2          set @QueryString='select * from tablename  where id=@id and name=@name'   --id与name为字段名,@id与@name为要传入的参数
          set @paramstring='@id int,@name varchar(20)' --设置动态语句中参数的定义的字符串,多个参数用","隔开
          set @input_id =1  --设置需传入动态语句的参数的值为1
          set @input_name='张三'   --设置需传入动态语句的参数的值为"张三"
          exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --请注意参数的顺序
     (2)输出参数
             declare @num int, @sqls nvarchar(4000) 
            set @sqls='select count(*) from tableName' 
            exec(@sqls) 
        --如何将exec执行结果放入变量中?          
        declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
        declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
        declare @output_result int--查询结果赋给@output_result         set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 为输出结果参数
        set @paramstring='@totalcount int output' --设置动态语句中参数的定义的字符串,多个参数用","隔开
        exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
        select @output_result
        当然,输入与输出参数可以一起使用,大家可以自己去试一试。
        另外,动态语句查询的结果集要输出的话,我只想到以下用临时表的方法,不知各位有没有更好的方法.
        IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除
            drop table #tmp
        select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同        declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
        set @QueryString='select * from tablename '
        insert into #tmp(field1,field2,...) exec(@querystirng) 

解决方案 »

  1.   


    USE [JXPSWB]
    GO
    /****** 对象:  StoredProcedure [dbo].[GetPagingDataList]    脚本日期: 03/14/2014 10:48:49 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[GetPagingDataList] 
    -- Add the parameters for the stored procedure here
    @PageNum int,
    @PageSize int,
    @SortOrder nvarchar(50),
    @OrderDire nvarchar(50),
    @StrWhere nvarchar(300),
    @Columns nvarchar(max),
    @TableName nvarchar(50),
    @KeyColumn nvarchar(50),
    @TotalCount int output 
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @NumCount int
    DECLARE @SqlString nvarchar(3000)
    DECLARE @ParmDefinition nvarchar(500)
    SET @NumCount = (@PageNum-1)*@PageSize
    SET @SqlString = N'select top (@size) @cols from @tname where @key not in (select top (@num) @key from @tname 
    where @strw order by @sort @order) and @strw order by @sort @order'
    SET @ParmDefinition = N'@size int
       ,@cols nvarchar(500)
       ,@tname nvarchar(50)
       ,@key nvarchar(50)
       ,@num int
       ,@strw nvarchar(500)
       ,@sort nvarchar(50)
       ,@order nvarchar(50)'
      EXECUTE SP_EXECUTESQL 
    @SqlString,
    @ParmDefinition,
    @size = @PageSize,
    @cols = @Columns,
    @tname = @TableName,
    @key = @KeyColumn,
    @num = @NumCount,
    @strw = @StrWhere,
    @sort = @SortOrder,
    @order = @OrderDire DECLARE @SqlStatistics nvarchar(1000) 
    SET @SqlStatistics = N'SELECT @num = COUNT(*) FROM @tname WHERE @strw'
    SET @ParmDefinition = N'@num int output
       ,@vname nvarchar(50)
       ,@strw nvarchar(300)'
      EXECUTE SP_EXECUTESQL 
    @SqlStatistics,
    @ParmDefinition,
    @num = @TotalCount output,
    @vname = @TableName,
    @strw = @StrWhere    -- Insert statements for procedure here
    SELECT @TotalCount
    END
    按照上面这个(里面还有错呢,也一起贴上来问吧)消息 1087,级别 15,状态 2,第 8 行
    必须声明表变量 "@tname"。
    消息 1087,级别 15,状态 2,第 8 行
    必须声明表变量 "@tname"。
    消息 1087,级别 15,状态 2,第 3 行
    必须声明表变量 "@tname"。第一个查询要求返回数据集
    第二个查询要求返回output