【问题标题】:TSQL sp_executesqlTSQL sp_executesql
【发布时间】:2015-03-23 21:02:21
【问题描述】:

我有一张简单的桌子:

CREATE TABLE [dbo].[test]
(    
    [eins] [varchar](50) NOT NULL,    
    [zwei] [varchar](50) NULL, 

    CONSTRAINT [PK_test] 
    PRIMARY KEY CLUSTERED ([eins] ASC)
         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
               ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

有两列 einszwei,都是 varchar(50)

价值观

insert into test(eins, zwei) values(1,2)

1 和 2 在相应的列中。

查询

select eins from test

给出1的正确结果

以下代码还在结果窗口中给出了1 的正确结果:

declare 
@in varchar(50),
@sql nvarchar(500)
set @in = 'eins'
set @sql = 'select ' + @in + ' from test'
Exec(@sql)

但是,它不使用输出参数,我需要将结果进行进一步处理。

所以,我试试:

exec sp_executesql N' Select @1 from test where zwei = @2',N'@1 nvarchar(100),@2 nvarchar(100)',@1=N'eins',@2=N'2'

预期结果为1。但是:结果是eins,即列名,而不是值。

如何查询 Select @Variable from @Variable2 where @variabel3 = @Variable4 之类的内容?

表和列可以是非可变的,如果需要,最重要的是Select @Variable。我需要这个值进行进一步处理。

【问题讨论】:

  • 我翻译成英文,所以我们可以保留它,假设@OliverNeis 可以接受翻译。
  • sp_executesql 与参数将,正如您所发现的,正是 not 在这里执行您想要的操作:“列名”没有 sql 参数数据类型。因此,构建类似于您第一次尝试的动态 sql 可能是唯一现实的方法。

标签: sql-server tsql sp-executesql


【解决方案1】:

试试这样的

DECLARE @result int
exec sp_executesql
    N'Select @1=eins from test where zwei = @2',
    N'@1   nvarchar(100) OUTPUT,@2 nvarchar(100)',
    @1=@result OUTPUT,@2=N'2'
SELECT @result

这意味着@1 是EXECed 查询字符串中的一个输出变量。然后它将@result 绑定到@1,以便您可以检索它。我从来没有发现 OUTPUT 参数使用起来非常直观。

【讨论】:

  • 您好,谢谢您的提示。
【解决方案2】:

上一篇文章中 DWright 的代码有正确的结果,但主要问题没有解决。 编写代码时我不知道列的名称。以下代码似乎是正确的:

 Declare @result int
Declare @sql nvarchar(500)
Declare @columnname nvarchar(50)

set  @columnname = 'eins'
set @sql= N'Select @1= ' + @columnname +' from test1 where zwei = @2'

exec sp_executesql
    @sql,
    N'@1   nvarchar(100) OUTPUT,@2 nvarchar(100)',
    @1=@result OUTPUT,@2=N'2'
SELECT @result

结果就是期望1

感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 2013-01-07
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多