SQL dynamic (passando o nome da tabela como parâmetro)

Eu quero escrever um procedimento armazenado que irá usar um parâmetro, que será o nome da tabela.

Por exemplo:

@tablename << Parameter SELECT * FROM @tablename 

Como isso é possível?

Eu escrevi isto:

 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetAllInterviewQuestions] @Alias varchar = null AS BEGIN Exec('Select * FROM Table as ' @Alias) END 

Mas diz syntax incorreta perto de @Alias.

Bem, em primeiro lugar você omitiu o ‘+’ da sua string. Essa maneira de fazer as coisas está longe de ser ideal, mas você pode fazer

 DECLARE @SQL varchar(250) SELECT @SQL = 'SELECT * FROM ' + QuoteName(@Alias) Exec(@SQL) 

Eu sugiro fortemente repensar como você faz isso, no entanto. A geração de SQL dynamic geralmente leva a vulnerabilidades de SQL Injection, além de dificultar o trabalho do SQL Server (e de outros DBs) na melhor maneira de processar sua consulta. Se você tiver um procedimento armazenado que possa retornar qualquer tabela, você não terá praticamente nenhum benefício de ser um procedimento armazenado, já que não conseguirá fazer muita otimização, e você estará em grande parte emasculating os benefícios de segurança também.

Você terá que fazer assim: exec('select * from '+@tablename+' where...')

Mas certifique-se de entender completamente os riscos, como ataques de injeção de SQL. Em geral, você nunca deveria precisar usar algo assim se o database for bem projetado.

Você não quer dizer

 Exec('SELECT * FROM ' + @tableName) 

Além disso, o erro que você recebe é porque você esqueceu um + antes do @Alias.

Muitas vezes, ter que parametrizar o nome da tabela indica que você deve repensar seu esquema de database. Se você estiver puxando perguntas de entrevista de muitas tabelas diferentes, provavelmente é melhor criar uma tabela com uma coluna distinguindo as perguntas da maneira que as diferentes tabelas tiverem.

A maioria das implementações de SQL não permite que você especifique elementos estruturais – nomes de tabelas, nomes de colunas, ordem por colunas, etc. – por meio de parâmetros; você tem que usar SQL dynamic para parametrizar esses aspectos de uma consulta.

No entanto, olhando para o SQL, você tem:

 Exec('SELECT * FROM Table AS ' @Alias) 

Certamente, isso significaria que o código sempre selecionaria apenas uma tabela chamada ‘Table’, e você precisaria concatenar o @Alias ​​com ele – e em muitos dialetos SQL, a concatenação é indicada por ‘ || ‘:

 Exec('SELECT * FROM Table AS ' || @Alias) 

Isso provavelmente ainda não faz o que você quer – mas pode não gerar um erro de syntax quando o procedimento é criado (mas provavelmente geraria um erro em tempo de execução).