Stwórz procedurę bez sprawdzania poprawności tabel

0

Temat pewnie nie jest zbyt jasny, chodzi o coś takiego.
Załóżmy, że mamy tabelę:

CREATE table tab(
  data varbinary(max)
)
 

I mamy taką procedurę:

CREATE procedure proc1
as
begin
  update tab set data = 'ABCD' -- pole data jest varbinary, a nie varchar
end

Problem jest taki. Tabela TAB kiedyś pole data miała typu VARCHAR. Procedura proc jest procedurą dotyczącą starych wersji bazy. Jest odpalana przez aplikację, gdy baza jest w odpowiedniej wersji.

Niestety w nowej wersji bazy, podczas wykonania CREATE procedure dostaję błąd niezgodności typów: Implicit conversion from data type varchar to varbinary(max). Zaznaczam - podczas CREATE, a nie podczas wykonywania procedury proc1. Jak tego uniknąć?

Problem dotyczy MSSQL 2005 i nowszych

0

Matko Boska! Koniec świata! Google przestało działać i z głupimi pytaniami przyszli na forum!

P.S. CONVERT

0

Zdaje się, że nie dokładnie przeczytałeś to, co napisałem.

0
CREATE PROCEDURE proc1
AS
BEGIN
  UPDATE tab SET DATA = CAST('ABCD' AS VARBINARY(MAX)) -- pole data jest varbinary, a nie varchar
END
0
Juhas napisał(a):

Zdaje się, że nie dokładnie przeczytałeś to, co napisałem.

Przeczytałem bardzo dokładnie. Musisz użyć funkcji CONVERT w procedurze aby zapisać napis w polu tego typu, napisałem z resztą o tym w postscriptum.

0

Autor chyba chce, żeby mu sie procedura skompilowala/utworzyła tak jak jest, mimo, że pole ma inny typ.

0

Jedyny sposób na założenie procedury z takim błędem, to jej tworzenie przed stworzeniem tabeli.

0

Przerzuć dane z tabeli do innej , dropnij tabele, utwórz procedurę, stwórz znów tabelę, przywróć zawartość z backupu.
Wiem, że nie zawsze jest to proste gdy istnieją powiązania, ale może akurat...

0
hyde napisał(a):

Autor chyba chce, żeby mu sie procedura skompilowala/utworzyła tak jak jest, mimo, że pole ma inny typ.

Dokładnie o to chodzi.

Nie mogę dropnąć tej tabelki tam. Problem jest taki, że w starej wersji bazy, tabela miała tam varchar. A ta procedura ma się odnieść do starej wersji bazy. Natomiast ma też być obecna w nowej wersji, gdzie pole jest typu varbinary.

Znalazłem inne rozwiązanie, jeśli nie można tak zrobić. Wyrzuciłem wszystkie te update'y i dorzuciłem je hurtowo w najnowszej procedurze migracyjnej, która już działa na varbinary. Poza tym ciekawostka - convert nie zadziała w taki sposób na MSSQL2005. Trzeba se napisać odpowiednią funkcję. Akurat można ją znaleźć w necie: HexStrToVarBin.

0

Hostel, myślałem, że jasno się wyraziłem. Procedura składowana, o którą się rozchodzi, jest procedurą migracyjną, która ma upgrade'ować bazę do nowej wersji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1