2013-05-09 45 views
0

我正在研究T-SQL中的一些非常长且复杂的过程,我需要在查询中使用相当多的变量。SQL Server上的存储过程中的查询中的变量 - 如何?

我就死在这样的事情:

SELECT @TableSQL = 'SELECT ' 
        + @columnsForInsert 
        + '= COALESCE(@columnsForInsert 
        + ''], ['', '''') 
        + name 
FROM MIGRATION_DICTIONARIES.dbo.' + @TableName + '_COLUMNS ' 
EXEC sp_executesql @TableSQL 
PRINT @columnsForInsert 

正如你可以看到我尝试将所有从一些临时表中的行连接成一条线,然后将其分配给@columnsForInsert变量。但是,当我通过sp_executesql运行此字符串时,它将转到@columnsForInsert不可见的范围。

你有没有人知道如何让这个跑步?

换句话说。我有类似的东西

SELECT @columnsForInsert = COALESCE(@columnsForInsert + '], [', '') + name 
FROM MIGRATION_DICTIONARIES.dbo.Foobar_COLUMNS 

这在我的程序中正常工作。然而,在Foobar的最终版本将会变得如此简单,以至于@tableName就不起作用。我怎样才能做到这一点?

我使用Microsoft SQL Server 2012

+6

语法没有意义... – 2013-05-09 07:51:31

+0

我需要使它在3个数据库和不同的表名上工作,所以我需要动态地准备查询,这是我发现的所有内容。其他像这样构建的查询,但我不知道如何将结果分配给变量。如果你有更好的想法如何解决它 - 我是开放的。 – Moby04 2013-05-09 08:00:20

回答

0

下面是如何从sp_executesql

http://support.microsoft.com/kb/262499

捕捉输出的例子。虽然我从来没有做过,它意味着下面的语法可能工作从sp_executesql中检索您的变量值(假设所有引号都在正确的位置且语法正确)

DECLARE @columnsForInsertOUT VARCHAR(400) 
DECLARE @columnsForInsert VARCHAR(400) 
DECLARE @ParmDefinition  VARCHAR(50) 
DECLARE @TableSQL   VARCHAR(200) 
DECLARE @TableName   VARCHAR(200) 

SELECT @TableSQL = 'SELECT @columnsForInsertOUT = COALESCE(@columnsForInsertOUT' 
       + ''], ['', '''') 
       + name 
FROM MIGRATION_DICTIONARIES.dbo.' + @TableName + '_COLUMNS ' 

SET @ParmDefinition = '@columnsForInsertOUT varchar(400) OUTPUT' 

EXECUTE sp_executesql 
@TableSQL, 
@ParmDefinition, 
@[email protected] OUTPUT 

SELECT @columnsForInsert 
相关问题