#sql #sql-server
#sql #sql-сервер
Вопрос:
Я пытаюсь вставить все записи из TableA в TableB. TableA существует, TableB — нет.
Вот моя хранимая процедура. Этот код работает, но он ограничен фиксированным именем таблицы TableB:
USE [myDatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
AS
BEGIN
SELECT *
INTO tableB
FROM tableA
END
Однако я хочу сделать TableB переменной, чтобы я мог передать ее из кода C #, это не работает, пожалуйста, помогите:
ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
@tableName varchar(32)
AS
BEGIN
SELECT *
INTO @tableName
FROM tableA
END
Пожалуйста, помогите — почему SQL Server не распознает @tableName
в строке выбора? Решения?
Ответ №1:
Вам необходимо использовать динамический SQL:
ALTER PROCEDURE [dbo].[myStoreProcedureFileName] (
@tableName varchar(32)
) AS
BEGIN
DECLARE @sql NVARCHAR(MAX) = 'SELECT * into @tableName from tableA';
SET @sql = REPLACE(@sql, '@tableName', @tableName);
EXEC sp_executesql @sql;
END;
Параметры могут заменять константы только в инструкции SQL. Они не могут заменить идентификаторы, операторы, имена функций или ключевые слова.
Комментарии:
1. Спасибо, Гордон! В Oracle эта простая строка работает. СОЗДАЙТЕ ТАБЛИЦУ TABEB КАК SELECT * FROM ТАБЛИЦАА знаете ли вы, как мне это сделать в MS SQL?
2. @Syntax_MM Извините,
CREATE TABLE AS
синтаксис недоступен в SQL Server.3. @Syntax_MM . . . Вы можете использовать
into
предложение в SQL Server (как показано здесь). Но имя не может быть параметром.4. @Syntax_MM . . . Есть причина, по которой вы не приняли этот ответ?
Ответ №2:
Вы должны использовать динамический SQL
declare @sql nvarchar(max);
set @sql = N'select * into ' @tableName N' from tableA';
exec sp_executesql @sql;
Комментарии:
1. Спасибо, Дмитрий! В Oracle работает этот простой вариант: СОЗДАЙТЕ ТАБЛИЦУ TABEB КАК SELECT * FROM ТАБЛИЦАА как мне это сделать в MS SQL, MS не распознает КАК?
2. СОЗДАТЬ ИМЯ ТАБЛИЦЫ В КАЧЕСТВЕ ВЫБОРА — это специфическая функция ORACLE. В T-SQL вы можете использовать SELECT … В оператор …. подробности и ограничения см. learn.microsoft.com/en-us/sql/t-sql/queries /…