私はSql ServerでSSMSで実行している以下のスクリプトを持っています。私は自分のテーブルのどの列が列名のどこかに「時間」を持っているかを調べようとしています。selectの文字列リテラルは、変数を使用するときに何か違うものを返します
最初の選択は、アクセスされているテーブルで使用可能な列を示します。
次の2つは私の質問です。最初の変数は、変数@timeColumnをN '%time%'を探している文字列に設定し、2番目の変数はリテラルを使用します。私はこれらの2つが同じ列名を返すことを期待するだろうが、それらはしません。なぜどんなアイデア?
USE MyLargeDB
declare @tableName NVARCHAR(100), @timeColumn NVARCHAR(100), @foundTimeCol NVARCHAR(100)
Set @tableName = N'Faults'
SET @timeColumn = N'%time%'
SELECT *
FROM sys.columns
WHERE Name LIKE @timeColumn
AND Object_ID = Object_ID(@tableName)
SET @foundTimeCol = (SELECT top 1 Name
FROM sys.columns
WHERE Name LIKE @timeColumn
AND Object_ID = Object_ID(@tableName))
print 'Found column with variable: ' + @foundTimeCol
SET @foundTimeCol = (SELECT top 1 Name
FROM sys.columns
WHERE Name LIKE N'%time%'
AND Object_ID = Object_ID(@tableName))
print 'Found column with literal string: ' + @foundTimeCol
あなたはデータが一貫性のために戻って来てほしい場合は、ORDER BY句を指定する必要があります。それ以外の場合は、SQLが毎回同じ順序でデータを提供するという保証はありません(通常はそうであるように見えます)。 – EMUEVIL