SQL dynamique de conversion d'erreur de type nvarchar à int
J'ai créé une procédure SQL dynamique qui a une instruction select et le code ressemble à:
ALTER PROCEDURE cagroup (
@DataID INT ,
@days INT ,
@GName VARCHAR(50) ,
@T_ID INT ,
@Act BIT ,
@Key VARBINARY(16)
)
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
DECLARE @SchemaName SYSNAME
DECLARE @TableName SYSNAME
DECLARE @DatabaseName SYSNAME
DECLARE @BR CHAR(2)
SET @BR = CHAR(13) + CHAR(10)
SELECT @SchemaName = Source_Schema ,
@TableName = Source_Table ,
@DatabaseName = Source_Database
FROM Source
WHERE ID = @DataID
SET @SQL = 'SELECT ' + @GName + ' AS GrName ,' + @BR
+ @T_ID + ' AS To_ID ,' + @BR
+ @DataID + ' AS DataSoID ,' + @BR
+ @Act + ' AS Active ,' + @BR
+ Key + ' AS key' + @BR
+ 'R_ID AS S_R_ID' + @BR
+ 'FROM' + @DatabaseName + '.'
+ @SchemaName + '.'
+ @TableName + ' t' + @BR
+ 'LEFT OUTER JOIN Gro g ON g.GName = '
+ @GName + @BR + 'AND g.Data_ID] =' + @DataID + @BR
+ 't.[I_DATE] > GETDATE() -' + @days + @BR
+ 'g.GName IS NULL
AND ' + @GName + ' IS NOT NULL
AND t.[Act] = 1' + @BR
PRINT (@SQL)
END
Quand je suis de l'exécution de cette procédure avec cette déclaration:
Exec dbo.cagroup 1,10,'[Gro]',1,1,NULL
J'obtiens l'erreur suivante.
Msg 245, Niveau 16, État 1, Procedurecagroup, Ligne 33
Échec de la Conversion lors de la conversion de la valeur nvarchar 'SÉLECTIONNEZ [Gro] COMME GName ,
"pour le type de données int.
Où suis-je fais de mal?
Que le code soit ne fonctionne pas ou qu'il a été modifié à partir de code de travail à faire unworking. En particulier, @GName n'est pas déclarée comme autant que je peux dire, et en tout cas, ce morceau de code: ET' + @GName + " n'EST PAS NULL ne fonctionnera pas à moins que @GName a des espaces blancs à l'avant et à l'arrière.
Roux j'ai édité le code de ceux qui étaient seulement typo
quel est le besoin pour le dynamicness?
le tableau va changer en fonction de l' @DataID
pourquoi ne pas simplement créer un script qui génère de votre crud procédures et puis il suffit de l'exécuter? ayant le code généré sp sera beaucoup plus facile à entretenir que de créer dynamiquement des insertions et les sélectionne.
Roux j'ai édité le code de ceux qui étaient seulement typo
quel est le besoin pour le dynamicness?
le tableau va changer en fonction de l' @DataID
pourquoi ne pas simplement créer un script qui génère de votre crud procédures et puis il suffit de l'exécuter? ayant le code généré sp sera beaucoup plus facile à entretenir que de créer dynamiquement des insertions et les sélectionne.
OriginalL'auteur | 2011-05-17
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de jeter tous les numéros de type nvarchar dans la concaténation.
Il n'est pas implicite VBA style de la conversion en chaîne de caractères. Dans le type de données SQL Server priorité signifie ints sont plus, alors, de type nvarchar: donc, l'ensemble de la chaîne est d'essayer d'être JETÉ à l'int.
Edit: est-ce Un a un bon point: regardez pour les Nuls!
regardez dans la fenêtre de messages
vérifiez qu'aucune des valeurs que vous utilisez dans votre concaténation sont NULL essayer de concaténer une valeur NULL et vous vous retrouverez avec une valeur NULL.
Un Ya que vous êtes l'un de mes valeur null dans la concaténation.Le paramètre de la Touche@, je suis de passage null Comment dois-je faire?
à utiliser si la valeur est null')
OriginalL'auteur gbn
Si vous avez à construire ce genre de SQL dynamique, il est préférable d'obtenir les informations d'une colonne à partir de la méta-données qu'à le passer autour.
La vous avez à écrire un vilain curseur pour générer le SQL. S'attendre à des problèmes de performances. Je fais beaucoup de cette au cours du développement de l'écriture de code pour moi, mais je n'ose pas le lancer en production.
OriginalL'auteur Bill