Classement de conflit entre les “SQL_Latin1_General_CP1_CI_AS” et “Modern_Spanish_CI_AS”, dans l'égalité de l'opération
J'ai été la création de cette fonction SQL de SQL SERVER 2008 R2 WINDOWS AZURE, mais je ne sais pas comment résoudre ce problème.
Msg 468, Niveau 16, État 9, Procédure GetObjectivesByTest, Ligne 69
Ne peut pas résoudre le conflit de classement entre
"SQL_Latin1_General_CP1_CI_AS" et "Modern_Spanish_CI_AS" dans l'égalité des
à l'opération.
CREATE FUNCTION [dbo].[GetObjectivesByTest](@testId smallint)
RETURNS
@res TABLE
(
-- Add the column definitions for the TABLE variable here
ObjectiveId smallint NOT NULL,
Name nvarchar(50) NOT NULL,
Expectations nvarchar(400) NULL,
[Level] nvarchar(5) NOT NULL,
ParentId smallint NULL,
LearningSystem nvarchar(30) NULL,
[Rank] tinyint NULL
)
AS
BEGIN
DECLARE @string VARCHAR(MAX)
SELECT @string = OBJECTIVES FROM TESTS WHERE TestId = @testId
DECLARE @temp TABLE
(
ColumnA NVARCHAR(50),
ColumnB NVARCHAR(500),
ID INT IDENTITY(1,1)
)
INSERT INTO @temp (ColumnA, ColumnB) VALUES ('', @string)
DECLARE @idx INT, @cnt INT
SET @idx = 1
SELECT @cnt = COUNT(*) FROM @temp
DECLARE @SplitStr nvarchar(1000),
@SplitChar nvarchar(5),
@Columns VARCHAR(50)
SET @SplitChar = ','
WHILE @idx <= @cnt BEGIN
SELECT @SplitStr = ColumnB
FROM @temp
WHERE id = @idx
DECLARE @RtnValue table
(
ColumnName VARCHAR(50),
Data VARCHAR(50)
)
Declare @Count int
Set @Count = 1
While (Charindex(@SplitChar,@SplitStr)>0) Begin
Insert Into @RtnValue (ColumnName,Data)
Select @Columns, Data = ltrim(rtrim(Substring(@SplitStr,1,Charindex(@SplitChar,@SplitStr)-1)))
Set @SplitStr = Substring(@SplitStr,Charindex(@SplitChar,@SplitStr)+1,len(@SplitStr))
Set @Count = @Count + 1
End
Insert Into @RtnValue (ColumnName,Data)
Select @Columns,Data = ltrim(rtrim(@SplitStr))
SET @idx = @idx + 1
END
INSERT @RES // here is appointing the error
SELECT C.*
FROM Objectives AS C
INNER JOIN OBJECTIVES AS B ON (C.ParentId = B.ObjectiveId)
INNER JOIN OBJECTIVES AS A ON (B.ParentId = A.ObjectiveId)
where C.Rank = 3 AND B.Rank = 2 AND A.Rank = 1 AND
A.LearningSystem + ' ' + A.Level + '.' + C.Level IN (SELECT Data FROM @RtnValue)
RETURN
END
Je n'ai pas d'idée sur ce problème, comment puis-je résoudre cette incompatibilité.
Merci à l'avance.
OriginalL'auteur Darf Zon | 2012-12-29
Vous devez vous connecter pour publier un commentaire.
Vous avez un classement de discordance entre le classement de base de données (@RtnValue.De données) et le classement utilisé dans les Objectifs.LearningSysten.
Solution la plus rapide peut être déclarer explicitement le classement dans @RtnValue:
C'est une solution rapide, cependant, vous devriez vérifier l'utilisation correcte des classements de base de données et de colonne de la table.
OriginalL'auteur devio
De classement définit la façon dont SQL Server compare les valeurs de chaîne, et est spécifié à divers niveaux au sein de SQL Server:
Certaines choses que vous devriez garder à l'esprit:
Vous ne pouvez pas implicitement de comparer les valeurs de chaîne avec des classements différents. Bien que la bonne chose à faire serait d'utiliser le bon classement, à travers le conseil d'administration, il existe quelques solutions de contournement. Voici vos options, dans l'ordre croissant de complexité:
Si c'est un cas isolé requête dans laquelle une table temp colonne de chaîne est en cours de comparaison avec une valeur correspondante dans la base de données, ou que vous êtes pressé et vous voulez juste pour obtenir ce travail, vous pouvez spécifier le classement dans la
WHERE
clause. Vous aurez besoin de le faire partout où vous comparez la chaîne de valeurs dans la base de données avec des variables locales dans des requêtes T-SQL:Votre prochaine option, et probablement la meilleure solution est de faire correspondre la base de données par défaut de classement et le classement utilisé dans toutes les colonnes de la chaîne dans la base de données. Modifier le classement de base de données est aussi simple que d'appeler
ALTER DATABASE MyDB COLLATE SQL_Latin1_General_CP1_CI_AS
, comme décrit dans la MSDN Technet article Définir ou de Modifier le Classement de Base de données. Ce qu'il ne le fera pas pour vous, cependant, est de changer le classement des colonnes dans la base de données. Vous pouvez générer un script pour le faire pour vous, cependant, en utilisant le système de tables. Je n'ai pas de SQL Server sur ma machine ici, donc je n'ai pas pu le tester, mais cela vous donnera une idée générale. Exécuter le script, de copier les résultats dans le volet SQL et ensuite l'exécuter.À noter qu'avec cette solution, vous aurez toujours besoin de spécifier le classement de toutes les colonnes utilisées dans des tables temporaires, qu'ils soient dans le cadre d'une procédure stockée ou un raw commande T-SQL. Cependant, c'est une bonne pratique, car si vous déployez cette base de données à un client qui a déjà son propre serveur de base de données et qu'ils souhaitent utiliser le même serveur, vous ne pouvez pas attendre d'eux de changer leur valeur par défaut du serveur de classement.
OriginalL'auteur Peter
Ces sont moches. Je connais deux façons de résoudre ce problème et ne sont tous qu'élégant:
Modifier le classement d'une des bases de données pour correspondre à l'autre: http://msdn.microsoft.com/en-us/library/ms175835(v=sql.105).aspx
Ou de modifier le classement de chacune des colonnes dans votre requête/table pour correspondre à la base de données de destination: http://msdn.microsoft.com/en-us/library/ms190920(v=sql.105).aspx
OriginalL'auteur