Je dois utiliser exec
à l'intérieur de la clause select
. La requête pour l'exec est créée en fonction des colonnes de la table sur laquelle la clause select est utilisée. Ce que je veux faire est quelque chose comme suit:
SELECT distinct
MTMain.[TableName],
MTMain.[TableFKey],
(select IsActive (exec GetStringForIsActive MTMain.[TableName],MTMain.[TableFKey]))
FROM
[MasterTableForLanguage] MTMain
Ici, GetStringForIsActive
est la procédure stockée que je veux exécuter pour chaque ligne sélectionnée dans MasterTableForLanguage
.
Le stored procedure
utilisera EXEC
pour exécuter la chaîne suivante
select IsActive from [TableName] where PKID= cast([TableFKey] as int)
TableName et TableFKey seront des entrées de la procédure stockée.
utilisez des fonctions au lieu de procédures stockées dans la clause SELECT.
Édité:
créer cette fonction
CREATE FUNCTION function1 (@TableName nvarchar(10),@TableFKey nvarchar(10))
RETURNS nvarchar(100) AS
BEGIN
-- do whatever here
END
puis
SELECT distinct
MTMain.[TableName],
MTMain.[TableFKey],
function1(MTMain.[TableName],MTMain.[TableFKey])
FROM
[MasterTableForLanguage] MTMain
Est-ce que ça a du sens?
Si vous pouvez modifier votre procédure stockée GetStringForIsActive pour renvoyer TableName, TableFKey et IsActive, vous pouvez utiliser un curseur pour l'exécuter pour chaque ligne et ajouter les résultats à une table temporaire.
c'est à dire:
exec GetStringForIsActive 'TableName', 'TableFKey'
returns
select [TableName], [TableFKey], IsActive from [TableName] where PKID= cast([TableFKey] as int)
Le code serait comme ça:
declare @TableName nvarchar(50)
declare @TableFKey nvarchar(50)
declare @Results table (TableName nvarchar(50), TableFKey nvarchar(50), IsActive bit)
declare TableCursor cursor fast_forward for
select TableName, TableFKey from MasterTableForLanguage
open TableCursor
fetch next from TableCursor into @TableName, @TableFKey
if @@FETCH_STATUS <> -1
print 'MasterTableForLanguage check'
while (@@FETCH_STATUS <> -1)
begin
insert into @Results
exec GetStringForIsActive @TableName, @TableFKey
fetch next from TableCursor into @TableName, @TableFKey
end
close TaleCursor
deallocate TableCursor
select * from @Results
Eh bien, je pense que pour répondre à la question complète, je ne crois pas qu'une procédure stockée exécuterait une instruction SELECT, elle effectuerait simplement la commande SELECT.
Vous exécutez votre proc actuel et transmettez-le vars, et il renvoie une valeur BASÉE sur l'instruction select qu'il exécute. Il ne s'agit pas d'exécuter cette déclaration, mais simplement d'effectuer une sélection. J'ai plusieurs procs stockés que j'utilise quotidiennement dans certains processus d'agent SQL, ils effectuent tous des sélections pour interroger différentes tables et aucun d'eux n'appelle un EXEC pour effectuer ces actions. Ceci est mon propre exemple:
CREATE PROCEDURE [myproc]
@job_ident INT
AS
BEGIN
SET NOCOUNT ON;
...
SELECT TOP(1) @filter_type = filter_type FROM [place] WHERE [ident] = @job_ident
...
END
Comme mentionné précédemment, le moyen le plus efficace d'exécuter votre requête serait d'effectuer cette sélection dans une fonction. Un résultat similaire à celui-ci suffira:
CREATE FUNCTION ThisFunction (
@TableName nvarchar(10),
@TableFKey nvarchar(10)
)
RETURNS nvarchar(100)
AS
BEGIN
RETURN
(
select IsActive from [TableName] where PKID= cast([TableFKey] as int)
)
END
Vous pouvez alors faire exactement ce que vous voulez ...
SELECT distinct
MTMain.[TableName],
MTMain.[TableFKey],
ThisFunction(MTMain.[TableName],MTMain.[TableFKey])
FROM
[MasterTableForLanguage] MTMain