передать имя моей таблицы в качестве параметра в запросе SQL - PullRequest
1 голос
/ 03 июня 2011

Мне нужна помощь с запросом.В моем запросе я хочу передать имя таблицы в качестве параметра.Это мой запрос:

SELECT DISTINCT 
    CONVERT (varchar, InspectDateTime) AS 'Inspect Date Time', 
    CONVERT (varchar, SynDateTime) AS 'Sync Date Time', 
    Employee, 
    ROUND(OverAllPercentage, 2) AS Grade 
FROM 
    Table_Name 
WHERE 
    (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
    BETWEEN 
        DATEADD(dd, DATEDIFF(dd, 0, @From ), 0) AND 
        DATEADD(dd, DATEDIFF(dd, 0, @To ), 0)) 
ORDER BY 
    'Inspect Date Time'

Здесь я хочу передать Table_Name в качестве параметра.Обратите внимание, что этот запрос уже принимает два аргумента в качестве параметра, а именно "@From "и" @To "

Ответы [ 4 ]

3 голосов
/ 03 июня 2011

ОК, если вы используете SQL Server (судя по функциям DATEADD и DATEDIFF), вам нужно

  1. создать объединенную команду sql в виде строки(стараясь не допустить внедрения SQL: то есть вы должны проверить, что ваша переменная table_name является допустимым именем таблицы, просмотрев форму возможных имен information_schema и проверив и т. д.)

  2. выполнить динамический SQL, используя sp_executesql: http://msdn.microsoft.com/en-us/library/ms188001.aspx

3 голосов
/ 03 июня 2011

Если вы работаете с MS SQL, вы можете сделать:

CREATE PROCEDURE sp_GetMyStuff
(
    @From datetime,
    @To datetime,
    @TableName nvarchar(100)
)
AS

exec('    
    SELECT DISTINCT 
        CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', 
        CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', 
        Employee, 
        ROUND(OverAllPercentage, 2) AS Grade 
    FROM 
        ' + @TableName + ' 
    WHERE 
        (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
        BETWEEN 
            DATEADD(dd, DATEDIFF(dd, 0, ' + @From + '), 0) AND 
            DATEADD(dd, DATEDIFF(dd, 0, ' + @To + '), 0)) 
    ORDER BY 
        1
');

и затем просто позвонить

sp_GetMyStuff '2011-05-05', '2011-06-05', 'TBL_MYTABLE'
3 голосов
/ 03 июня 2011

В SQL Server, если вы хотите «параметризовать» имя таблицы, вы должны использовать динамический SQL

Если это так, вы должны прочитать Эрланда Проклятие и Благословениединамического SQL в качестве вступления.

Таким образом, по сути, вам нужно создать оператор SQL в виде строки, а затем выполнить его.Другого способа «параметризовать» имя таблицы в инструкции SQL Server T-SQL не существует.

0 голосов
/ 05 июня 2011

Спасибо, Балександр.Последний запрос после незначительной модификации (приведение @ From, @ To в varchar):

CREATE PROCEDURE sp_GetMyStuff

@TableName VARCHAR(128),
@From DATETIME,
@To DATETIME

AS

DECLARE @sql VARCHAR(4000)
SELECT @sql = 'SELECT DISTINCT CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', Employee, ROUND(OverAllPercentage, 2) AS Grade
FROM ' + @TableName + '
WHERE
(DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) BETWEEN DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@From AS VARCHAR(100)) +''' ), 0)
AND DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@To AS VARCHAR(100)) +'''), 0))
ORDER BY ''Inspect Date Time'''
EXEC (@sql)

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...