declare @showkey varchar(100)
declare @string varchar(100)
DECLARE @TableName VARCHAR(1000)
SET @TableName='temptable'
SET @showkey='SELECT '+'Keyword '+'FROM '+@TableName+' WHERE id=78'
exec(@showkey)
PRINT @showkey
--到这里都显示的结果为 类似 |xx|xx|xx|xx|
SET @string=@showkey
PRINT @string
--到这里都显示的结果为 类似 |xx|xx|xx|xx|select * from dbo.LewiSplitID(@string,'|')
PRINT @string
--到这里却变直接变成了 SELECT Keyword FROM News WHERE ID=78
为何他没有正确将 ¦xx ¦xx ¦xx ¦xx ¦的值正确的传入 @string 呢,而是直接传进来了查询语句附上函数.CREATE
  FUNCTION [dbo].[LewiSplitID](@String NVARCHAR(4000), @SplitChar NVARCHAR(10))
  RETURNS @table TABLE (ID VARCHAR (100)) AS  
BEGIN  
   DECLARE  @Index  INT  
   SET  @Index  =  0  
        IF @String <> ''
        BEGIN            
            IF RIGHT(@String,1)<> @SplitChar 
            SET @String = @String + @SplitChar
            IF LEFT(@String,1)= @SplitChar 
            SET @String = STUFF(@String, 1, 1, '')
        End
       WHILE  CHARINDEX(@SplitChar,@String,@Index)  >  0    
       BEGIN  
           INSERT INTO @table(ID) 
           VALUES (SUBSTRING(@String, @Index, CHARINDEX(@SplitChar, @String,@Index) - @Index))
           SET @index = CHARINDEX(@SplitChar, @String, @Index) + 1 
       END  
RETURN  
END
恳请老师帮忙解答,想了一个晚上 ,不知道错哪儿了!

解决方案 »

  1.   


    --函数不用修改。try:declare @showkey nvarchar(100)
    declare @string varchar(100)
    DECLARE @TableName VARCHAR(1000)
    SET @TableName='temptable'
    SET @showkey='SELECT @key=Keyword  FROM '+@TableName+' WHERE id=78'
    exec sp_executesql @showkey,N'@key varchar(100) output',@string output
    select * from dbo.LewiSplitID(@string,'|')
      

  2.   


    多谢老师指点!问题成功得到解决!
    SET @showkey='SELECT @key=Keyword  FROM '+@TableName+' WHERE id=78'
    exec sp_executesql @showkey,N'@key varchar(100) output',@string output
    --这两句一定要好好琢磨,还看不懂.
      

  3.   


    动态sql语句基本语法1 :普通SQL语句可以用Exec执行
    eg: Select * from tableName 
    Exec(select * from tableName) 
    Exec sp_executesql Nselect * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
    eg: 
    declare @fname varchar(20) 
    set @fname = FiledName 
    Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec(select + @fname + from tableName) -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = FiledName --设置字段名 declare @s varchar(1000) 
    set @s = select + @fname + from tableName 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句会报错 
    declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) 
    set @s = select + @fname + from tableName 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句正确 3. 输出参数
    declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls=select count(*) from tableName 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls=select @a=count(*) from tableName 
    exec sp_executesql @sqls,N@a int output,@num output 
    select @num 
      

  4.   


    严重了。
    ps:周末不愉快。现在还在加班ing........又怎愉快的起来?