在select * from语句中使用变量字符串

时间:2016-10-14 18:25:33

标签: sql sql-server select

这样的事情可能吗?:

DECLARE @test nvarchar(30) = 'Appt'

SELECT * FROM @test.dbo.tablename with (NOLOCK)

或可能

DECLARE @test nvarchar(30) = 'Appt'

SELECT * FROM @test + '.dbo.tablename' with (NOLOCK)    

不,对吧?

我不希望将整个字符串放入变量中,然后使用" EXEC。"我有很长的脚本,我想尝试用它来替换它。

谢谢。

2 个答案:

答案 0 :(得分:1)

这需要动态SQL。基本上,您创建一个字符串,根据您的查询动态构建SQL语句。然后使用EXEC语句执行该字符串。一个基本的例子是这样的:

DECLARE @test nvarchar(30) = 'Appt'
DECLARE @sql as varchar(max)
SET @SQL = 'SELECT * FROM' +  @test + '.dbo.tablename' + 'with (NOLOCK)'
EXEC @SQL

假设您的表名为Appt.dbo.tablename

我认为你的意思是:

SET @SQL = 'SELECT * FROM' +  'dbo.' + @test + ' with (NOLOCK)'

答案 1 :(得分:1)

很好的解释logixologist。

因为Tom想要为多个select语句运行它,我认为他可以将所有表名存储在一列中并使用游标来获取表值。考虑到您将首先创建一个表,例如:

CREATE TABLE tableName ( name varchar(20));

然后在上表中插入正确的值后运行以下代码。

Declare @table VARCHAR(255)
DECLARE @sql as varchar(max)
SET @SQL = 'SELECT * FROM' +  'dbo.' + @table + ' with (NOLOCK)'

DECLARE table_cursor CURSOR FOR 
select distinct([name]) FROM DBname.dbo.tableName
Where [name] is not null

OPEN table_cursor
FETCH Next from table_cursor 
INTO @table
WHILE @@FETCH_STATUS =0
BEGIN

EXEC @SQL

FETCH NEXT FROM table_cursor
INTO @table
END
CLOSE table_cursor
DEALLOCATE table_cursor

游标将返回select语句的表名。我认为你可以对插入语句使用相同的逻辑。