2017-07-05 43 views
-1

列名我有一个临时表aaa,我作为一个数组使用。SQL:基于可变

USE tempdb 
    GO 

    IF OBJECT_ID('tempdb..aaa') IS NOT NULL DROP TABLE aaa 
    CREATE TABLE aaa (
     #1 char(40), 
     #2 char(40), 
     #3 char(40) 
    ); 
    insert into aaa values ('aaaa','qqqq','eeee'); 
    declare @sql varchar(40); 
    declare @var varchar(40)='#3'; 
    set @sql= '(select '[email protected] +' from aaa)'; 
     print @sql; 

我试图做到的,是存储到变量@sql的'(select '[email protected] +' from aaa)'执行的值,它是:eeee,而不是简单的字符串(select #3 from aaa)

我知道,'这不是如何SQL应该工作',但后320题阅读SO(我的历史标签可以证明)我的想法:)

+0

阅读关于动态SQL:[link1](https://technet.microsoft.com/pl-pl/library/ms188001(v = sql.110).aspx),[示例](https:// www。 mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/) – Rokuto

+0

我对你想做什么感到困惑。你不要在任何地方执行你的SQL。为什么要将结果值存储在名为'@ sql'的变量中? –

+0

您*已经*听说过['EXECUTE'](https://docs.microsoft.com/sql/t-sql/language-elements/execute-transact-sql),对不对? –

回答

3

[1] tempdb..aaa不是一个临时表。相反,它是没有什么比tempdb数据库中创建一个标准表更多,这意味着将删除当SQL Server数据库引擎服务重新开始tempdb数据库重新创建每次启动该服务/ 重新开始)。

[2]如果你想使用一个临时表,那么你可以使用下面的语法:

CREATE TABLE #Array (RowNum INT NOT NULL, Val AS VARCHAR(10)) -- See # prefix that means a local temp table 

CREATE TABLE ##Array (RowNum INT NOT NULL, Val AS VARCHAR(10)) -- See ## prefix that means a global temp table 

例子:

INSERT #Array (RowNum, Val) VALUES (1, 'A') 
INSERT #Array (RowNum, Val) VALUES (2, 'BBB') 

SELECT ... FROM #Array WHERE RowNum = 1 

要查看所有选项完整列表存储/ SQL Server中使用数组看到下面的文章中写道由厄兰Sommarskoghttp://www.sommarskog.se/arrays-in-sql.html。我个人的选择是使用XML或@table变量。

[3]关于由当前问题建议的方法:它是坏的。假设我们必须模拟一个数组,那么该数组中的值应该被存储(如果我们正在使用tables/## temp tables/@table变量)在行的单列内(参见上面的例子),而不是在不同的列( Col1,Col2等)。

我的建议是阅读Erland Sommarskog的文章,并为您的场景选择合适的解决方案。

+1

感谢您使用XML的建议。知道这似乎是最可行的事情 –

0

您可以使用sp_executesqlOUTPUT参数指定的标量结果:

IF OBJECT_ID('tempdb..aaa') IS NOT NULL DROP TABLE aaa 
CREATE TABLE aaa (
    #1 char(40), 
    #2 char(40), 
    #3 char(40) 
); 
INSERT INTO aaa VALUES ('aaaa','qqqq','eeee'); 
DECLARE @sql nvarchar(40); 
DECLARE @sqlStatement nvarchar(MAX); 
DECLARE @var varchar(40)='#3'; 
SET @sqlStatement = '(SELECT '[email protected] +' FROM aaa)'; 
EXEC sp_executesql @sqlStatement, N'@sql varchar(40) OUTPUT', @sql = @sql OUTPUT; 
PRINT @sql; 

我想用一个名为@sql的结果变量是有点混乱。

1

我很抱歉地说,但你发布的代码是完全不合理的。
而是使用动态SQL乱搞,你应该简单地改变你的表结构只包含两列 - 一个索引,另一个值:

CREATE TABLE aaa (
    id int identity(1, 1), 
    val char(40) 
) 

INSERT INTO aaa VALUES 
('aaaa'), 
('qqqq'), 
('eeee') 

SELECT val 
FROM aaa 
WHERE Id = 3 
0

您可以创建临时表(或表变量),并插入你的动态sql结果。

create table #tmpResult (res CHAR(40)); 

declare @sql varchar(40); 
declare @var varchar(40)='#3'; 
set @sql= '(select '[email protected] +' from aaa)'; 
insert #tmpResult 
exec (@sql) 

select * from #tmpResult --you can easily fill @sql variable from here 

,或者你甚至可以改变你的动态SQL包括此插入:

create table #tmpResult (res CHAR(40)); 

declare @sql varchar(40); 
declare @var varchar(40)='#3'; 
set @sql= 'insert #tmpResult select '[email protected] +' from aaa'; 
exec (@sql) 

select * from #tmpResult